【转载】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/laughmoon/archive/2013/05/24/3098133.html

[转载]如何捕获控制台消息相关推荐

  1. SetConsoleCtrlHandler 处理控制台消息

    http://blog.csdn.net/zhongguoren666/article/details/8770615 SetConsoleCtrlHandler 处理控制台消息 一.如何处理所有的控 ...

  2. C#捕获控制台(console)关闭事件

    有时,公司内部自己开发的控制台(console)应用程序在服务器上运行会因为遇到某些异常自动关闭了,这就需要用某机制来捕获控制台(console)关闭事件,把这样写日志,便于维护和调试. 源码如下: ...

  3. python流获取控制台_对Python捕获控制台输出流的方法详解

    有时候我们的代码里可能要调用控制台命令,比如我想用Python写一个批量编译 .java 文件的脚本,用到如下代码 常规用法 os.system import os,traceback try: p ...

  4. [moka同学笔记转载]Yii 设置 flash消息 创建一个渐隐形式的消息框

    来源:http://www.cnblogs.com/xp796/p/5481004.html Yii 设置 flash消息 创建一个渐隐形式的消息框 1 /*适用情况:比如提交一个表单,提交完成之后在 ...

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

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

  6. 【转载】Objective-C runtime 消息机制

    在Objective-C中,message与方法的真正实现是在执行阶段绑定的,而非编译阶段.编译器会将消息发送转换成对objc_msgSend方法的调用. objc_msgSend方法含两个必要参数: ...

  7. c中获取python控制台输出_在真实的tim中用C捕获控制台python打印

    我正在尝试从C创建一个python进程,并从python脚本获取打印结果.在 这就是我的C代码:namespace ConsoleApp1 { public class CreateProcess { ...

  8. MFC初探 —— 捕获键盘消息

    方式一:重载PreTranslateMessage() 在类向导的虚函数中增加PreTranslateMessage() 注意:如果处理WM_KEYDOWN消息,按键在按下不抬起的情况下,每隔一段时间 ...

  9. [转载]CDatetimeCtrl的DTN_DATETIMECHANGE消息响应两_yuan1988219_新浪博客

    原文地址:CDatetimeCtrl的DTN_DATETIMECHANGE消息响应两次解决方法作者:代码小卒 背景:通过日历弹出框修改日期是,DTN_DATETIMECHANGE消息响应两次,需要只截 ...

  10. java 从控制台读取_转载 java从控制台读取输入的方法

    import java.io.BufferedReader;   import java.io.IOException;   import java.io.InputStreamReader;   i ...

最新文章

  1. 10个有趣的javascript和css库(2019年5月最新)
  2. 独家 | 10分钟带你上手TensorFlow实践(附代码)
  3. 如何在Android平台下进行Socket通信
  4. Tomcat、JDK 历史版本下载地址
  5. LeetCode 1942. 最小未被占据椅子的编号(set)
  6. 关于iOS7里的JavaScriptCore framework
  7. .NET 指南:包装异常
  8. java 继承 this_java多重继承的this属于谁
  9. 【笔记】关于OpenCV中的去畸变代码
  10. 长江课堂作业答案_长江作业本答案
  11. android 编写优质代码,GitHub - RayFantasyStudio/iCode-Android: 为开发者而生,提供在线代码存放,展示你优秀代码的平台...
  12. springboot微服务使用Feign远程调用失败
  13. 从一个app里面 跳转到另一个 app
  14. 电脑只能上微信QQ不能浏览网页(解决方法)
  15. 中枢神经系统解剖结构图,神经系统的解剖结构
  16. 吃鸡服务器显示错误代码103,安装错误代码103怎么回事?
  17. cocos2d-js 游戏源码
  18. 软件性能测试方案模板,软件系统 性能设计方案 软件系统设计方案模板
  19. 网络爬虫学习第一弹:urllib库使用
  20. 【报错解决】:ModuleNotFoundError: No module named ‘d2lzh_pytorch‘

热门文章

  1. HTTP 缓存机制及原理
  2. CentOS 7.2 rpm 安装 Mysql 5.7
  3. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_05-freemarker基础-List指令
  4. LGOJP1941 飞扬的小鸟
  5. [原创]一篇无关技术的小日记(仅作暂存)
  6. 漫谈Java IO之 NIO那些事儿
  7. 关于集合和字符串的互转
  8. javascript AOP实现
  9. codeforces 493 D Vasya and Chess【 博弈 】
  10. Smarty3的性能问题