http://blog.csdn.net/zhongguoren666/article/details/8770615

SetConsoleCtrlHandler 处理控制台消息

一、如何处理所有的控制台消息。

  第一步,首先要安装一个事件钩子,也就是说要建立一个回调函数。调用Win32 API,原型如下:

BOOL SetConsoleCtrlHandler(

PHANDLER_ROUTINE HandlerRoutine, // 回调函数

BOOL Add // 表示添加还是删除

);

  参数HandlerRoutine是一个指向函数的指针,原型如下:

BOOL WINAPI HandlerRoutine(

DWORD dwCtrlType // 控制事件类型

);

  所有的HandlerRoutine函数只有一个参数dwCtrlType,他表示控制台发出了什么消息。参数有下列值:

CTRL_C_EVENT - 当用户按下了CTRL+C,或者由GenerateConsoleCtrlEvent API发出.

CTRL_BREAK_EVENT - 用户按下CTRL+BREAK, 或者由GenerateConsoleCtrlEvent API发出.

CTRL_CLOSE_EVENT - 当试图关闭控制台程序,系统发送关闭消息。

CTRL_LOGOFF_EVENT - 用户退出时,但是不能决定是哪个用户.

CTRL_SHUTDOWN_EVENT - 当系统被关闭时.

  当收到事件的时候,HandlerRoutine可以选择处理,或者简单的忽略。如果回调函数选择忽略,函数返回FALSE,系统将处理下一个钩子程序。如果处理消息,程序在处理完消息后应该返回TRUE。

CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT和CTRL_SHUTDOWN_EVENT通常被用来处理一些程序的清理工作,然后调用ExitProcess API。另外,这三个事件有超时机制,CTRL_CLOSE_EVENT是5秒,另外两个是20秒。如果程序超时候,系统将会弹出结束进程的对话框。如果用户选择了结束进程,任何清理工作都不会做,所以应该在超时时间内完成工作。下面是一个回调函数的例子:

BOOL WINAPI ConsoleHandler(DWORD CEvent)

{

char mesg[128];

switch(CEvent)

{

case CTRL_C_EVENT:

MessageBox(NULL,

"CTRL+C received!","CEvent",MB_OK);

break;

case CTRL_BREAK_EVENT:

MessageBox(NULL,

"CTRL+BREAK received!","CEvent",MB_OK);

break;

case CTRL_CLOSE_EVENT:

MessageBox(NULL,

"Program being closed!","CEvent",MB_OK);

break;

case CTRL_LOGOFF_EVENT:

MessageBox(NULL,

"User is logging off!","CEvent",MB_OK);

break;

case CTRL_SHUTDOWN_EVENT:

MessageBox(NULL,

"User is logging off!","CEvent",MB_OK);

break;

}

return TRUE;

}

  好,现在已经有了回调函数,再来看看怎么安装钩子:

if (SetConsoleCtrlHandler(

(PHANDLER_ROUTINE)ConsoleHandler,TRUE)==FALSE)

{

// unable to install handler...

// display message to the user

printf("Unable to install handler!\n");

return -1;

}

  第一个参数是函数指针,就是上面的那个函数。第二个参数是标志,如果为TRUE那么就安装钩子,如果为FALSE那么删除钩子。

  好了,在安装了钩子后,我们就能收到控制台消息了,在程序退出前,要删除钩子。很简单吧。

转载于:https://www.cnblogs.com/NickyYe/p/5512077.html

SetConsoleCtrlHandler 处理控制台消息相关推荐

  1. linux用m4重定向,liunx重定向控制台消息

    Linux 在控制台记录策略上允许一些灵活性, 它允许你发送消息到一个指定的虚拟控制台 (如果你的控制台使用的是文本屏幕). 缺省地, 这个"控制台"是当前虚拟终端. 为了选择 一 ...

  2. SetConsoleCtrlHandler() -- 设置控制台信号处理函数

    http://www.groad.net/bbs/thread-8253-1-1.html 当你在命令行里工作时,经常会输入 Ctrl-C 这个组合键以停止程序的运行.SetConsoleCtrlHa ...

  3. C语言转义序列空字符,c语言-转义序列

    Android四大组件一----Activity 最新面试需要复习一下Android基础. {所谓Activity} 通俗点:app上看到的窗口基本都是Activity Android 程序一般是由多 ...

  4. Windows控制台程序处理消息编程实例二则

    一 控制台程序处理Windows消息 #include <stdio.h> #include <windows.h>BOOL WINAPI ConsoleHandler(DWO ...

  5. F12 开发人员工具中的控制台错误消息

    使用此参考解释显示在 Internet Explorer 11 的控制台 和调试程序中的错误消息. 简介 使用 F12 开发人员工具进行调试时,错误消息(例如 EC7111 或 HTML1114)将显 ...

  6. F12 开发人员工具控制台错误消息

    F12 开发人员工具控制台错误消息 12(共 17)对本文的评价是有帮助 - 评价此主题 此内容参考较早版本的 F12 工具.请查看最新的 F12 工具文档. F12 工具控制台可以报告在运行时期间发 ...

  7. IE F12 开发人员工具控制台错误消息

    F12 开发人员工具控制台错误消息 此内容参考较早版本的 F12 工具.请查看最新的 F12 工具文档. F12 工具控制台可以报告在运行时期间发生的错误和信息消息.本文将介绍错误消息,并提供有关如何 ...

  8. html怎么根据控IE制台找错误,IE调试网页之三:控制台查看错误和状态

    使用 F12 开发人员工具控制台命令,可以接收来自 Windows Internet Explorer 9 的错误消息,并从代码发送回你自己的消息,而无需中断执行流. 可以使用 F12 工具控制台视图 ...

  9. RabbitMQ(消息队列)浅记

    消息队列 PS:大二下学习RabbitMQ的随手小记 一.什么是 MQ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是message 而 ...

最新文章

  1. android view 转Bitmap 生成截图
  2. Python 之杀不死的Shell子进程
  3. 个人专著推荐1:Red Hat Linux 9实务自学手册(含光盘)
  4. 【区块链】认识区块链的基本概念
  5. 漫话:如何给女朋友解释什么是删库跑路?
  6. 对于Python中回调函数的理解
  7. AVFoundation 零碎知识
  8. Android font-awesome 4.2 icons png(包含holo-light和holo-dark)
  9. 计算机专业研究生的读研规划思考------转载
  10. EasyWeChat实现微信真实支付操作
  11. Arduino for esp8266串口功能简介
  12. android spinner 取消默认值,令请选择
  13. 爬取豆瓣 TOP250 电影排行榜
  14. python解决买鸡问题:3文钱可以买1只公鸡,2文钱可以买一只母鸡,1文钱可以买3只小鸡。用100 文 钱买100 只鸡,那么各有公鸡、母鸡、小鸡多少只?
  15. 19 01 18 dango 模型
  16. 计算机导论中逻辑与或非的公式,12.函数与公式之逻辑函数(or,and,not,if)
  17. 如何解决wup.exe文件占用cpu资源,彻底删除
  18. java在控制台用星号打印出圆形
  19. torch-geometric安装详细步骤
  20. YV12toI420 yuv420、NV12、YV12相互转换

热门文章

  1. mysql一些原生基本操作
  2. 「高并发秒杀」java课程设计报告模板
  3. python【Numpy科学计算库】Numpy的超实用基础详细教程(看不懂你来打我)
  4. Android UI开发
  5. python入门与提高实践,Python基础06:功能增强与实践,基础知识,学习,函数,加强,及,练习...
  6. tp 扫码点餐 源码_同城跑腿系统小程序源码搭建平台模式案例
  7. 前端运行python代码几种方式_前的解释|前的意思|汉典“前”字的基本解释
  8. java 教室借用管理系统_教师办事指南 | 借用教室
  9. r - 求平均成绩_学霸秘籍:小学数学知识点例题讲解 — 平均数问题
  10. javax消息队列_java实现消息队列的两种方式(小结)