[转载]如何捕获控制台消息
【转载】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
[转载]如何捕获控制台消息相关推荐
- SetConsoleCtrlHandler 处理控制台消息
http://blog.csdn.net/zhongguoren666/article/details/8770615 SetConsoleCtrlHandler 处理控制台消息 一.如何处理所有的控 ...
- C#捕获控制台(console)关闭事件
有时,公司内部自己开发的控制台(console)应用程序在服务器上运行会因为遇到某些异常自动关闭了,这就需要用某机制来捕获控制台(console)关闭事件,把这样写日志,便于维护和调试. 源码如下: ...
- python流获取控制台_对Python捕获控制台输出流的方法详解
有时候我们的代码里可能要调用控制台命令,比如我想用Python写一个批量编译 .java 文件的脚本,用到如下代码 常规用法 os.system import os,traceback try: p ...
- [moka同学笔记转载]Yii 设置 flash消息 创建一个渐隐形式的消息框
来源:http://www.cnblogs.com/xp796/p/5481004.html Yii 设置 flash消息 创建一个渐隐形式的消息框 1 /*适用情况:比如提交一个表单,提交完成之后在 ...
- linux用m4重定向,liunx重定向控制台消息
Linux 在控制台记录策略上允许一些灵活性, 它允许你发送消息到一个指定的虚拟控制台 (如果你的控制台使用的是文本屏幕). 缺省地, 这个"控制台"是当前虚拟终端. 为了选择 一 ...
- 【转载】Objective-C runtime 消息机制
在Objective-C中,message与方法的真正实现是在执行阶段绑定的,而非编译阶段.编译器会将消息发送转换成对objc_msgSend方法的调用. objc_msgSend方法含两个必要参数: ...
- c中获取python控制台输出_在真实的tim中用C捕获控制台python打印
我正在尝试从C创建一个python进程,并从python脚本获取打印结果.在 这就是我的C代码:namespace ConsoleApp1 { public class CreateProcess { ...
- MFC初探 —— 捕获键盘消息
方式一:重载PreTranslateMessage() 在类向导的虚函数中增加PreTranslateMessage() 注意:如果处理WM_KEYDOWN消息,按键在按下不抬起的情况下,每隔一段时间 ...
- [转载]CDatetimeCtrl的DTN_DATETIMECHANGE消息响应两_yuan1988219_新浪博客
原文地址:CDatetimeCtrl的DTN_DATETIMECHANGE消息响应两次解决方法作者:代码小卒 背景:通过日历弹出框修改日期是,DTN_DATETIMECHANGE消息响应两次,需要只截 ...
- java 从控制台读取_转载 java从控制台读取输入的方法
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; i ...
最新文章
- 10个有趣的javascript和css库(2019年5月最新)
- 独家 | 10分钟带你上手TensorFlow实践(附代码)
- 如何在Android平台下进行Socket通信
- Tomcat、JDK 历史版本下载地址
- LeetCode 1942. 最小未被占据椅子的编号(set)
- 关于iOS7里的JavaScriptCore framework
- .NET 指南:包装异常
- java 继承 this_java多重继承的this属于谁
- 【笔记】关于OpenCV中的去畸变代码
- 长江课堂作业答案_长江作业本答案
- android 编写优质代码,GitHub - RayFantasyStudio/iCode-Android: 为开发者而生,提供在线代码存放,展示你优秀代码的平台...
- springboot微服务使用Feign远程调用失败
- 从一个app里面 跳转到另一个 app
- 电脑只能上微信QQ不能浏览网页(解决方法)
- 中枢神经系统解剖结构图,神经系统的解剖结构
- 吃鸡服务器显示错误代码103,安装错误代码103怎么回事?
- cocos2d-js 游戏源码
- 软件性能测试方案模板,软件系统 性能设计方案 软件系统设计方案模板
- 网络爬虫学习第一弹:urllib库使用
- 【报错解决】:ModuleNotFoundError: No module named ‘d2lzh_pytorch‘