SetConsoleCtrlHandler 处理控制台消息(转)

来自:http://andylin02.iteye.com/blog/661431

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

  第一步,首先要安装一个事件钩子,也就是说要建立一个回调函数。调用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那么删除钩子。

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

SetConsoleCtrlHandler此函数用于console程序中,但它是windows中的程序,是无界面的,所以在使用时,在console程序中加入windows.h即可。

msdn中的例子程序为

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
BOOL CtrlHandler( DWORD fdwCtrlType )
{
 switch( fdwCtrlType )
 {
  // Handle the CTRL-C signal.
 case CTRL_C_EVENT:
  printf( "Ctrl-C event\n\n" );
  Beep( 750, 300 );
  return( TRUE );
  // CTRL-CLOSE: confirm that the user wants to exit.
 case CTRL_CLOSE_EVENT:
  Beep( 600, 200 );
  printf( "Ctrl-Close event\n\n" );
  return( TRUE );
  // Pass other signals to the next handler.
 case CTRL_BREAK_EVENT:
  Beep( 900, 200 );
  printf( "Ctrl-Break event\n\n" );
  return FALSE;
 case CTRL_LOGOFF_EVENT:
  Beep( 1000, 200 );
  printf( "Ctrl-Logoff event\n\n" );
  return FALSE;
 case CTRL_SHUTDOWN_EVENT:
  Beep( 750, 500 );
  printf( "Ctrl-Shutdown event\n\n" );
  return FALSE;
 default:
  return FALSE;
 }
}
void main( void )
{
 if( SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE ) )
 {
  printf( "\nThe Control Handler is installed.\n" );
  printf( "\n -- Now try pressing Ctrl+C or Ctrl+Break, or" );
  printf( "\n    try logging off or closing the console...\n" );
  printf( "\n(...waiting in a loop for events...)\n\n" );
  while( 1 ){ }
 }
 else
  printf( "\nERROR: Could not set control handler");
}
时间: 2024-08-08 19:45:38

SetConsoleCtrlHandler 处理控制台消息(转)的相关文章

Win32编程中如何处理控制台消息

这篇文章讨论如何处理所有的控制台消息. 第一步,首先要安装一个事件钩子,也就是说要建立一个回调函数.调用Win32 API,原型如下: BOOL SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, // 回调函数BOOL Add // 表示添加还是删除): 参数HandlerRoutine是一个指向函数的指针,原型如下: BOOL WINAPI HandlerRoutine(DWORD dwCtrlType // 控制事件类型): 所有的

重定向控制台消息

Linux 在控制台记录策略上允许一些灵活性, 它允许你发送消息到一个指定的虚拟控制台 (如果你的控制台使用的是文本屏幕). 缺省地, 这个"控制台"是当前虚拟终端. 为了选择 一个不同地虚拟终端来接收消息, 你可对任何控制台设备调用 ioctl(TIOCLINUX). 下面 的程序, setconsole, 可以用来选择哪个控制台接收内核消息; 它必须由超级用户运行, 可以从 misc-progs 目录得到. 下面是全部程序. 应当使用一个参数来指定用以接收消息的控制台的编号. in

IE调试网页之四:F12 开发人员工具控制台错误消息 (Windows)(转载)

F12 工具控制台可以报告在运行时期间发生的错误和信息消息.本文将介绍错误消息,并提供有关如何修正这些错误的建议. 简介 F12 工具控制台错误消息提供了一些代码(例如,SEC7111 或 HTML1114),这些代码提供有关错误的信息.这些代码和消息显示在 F12 工具的"控制台"和"脚本"选项卡中.对于 JavaScript 编程人员来说,这些代码是从 Windows Internet Explorer 引发的.ActiveX 和浏览器扩展开发人员还可发送这些错

控制台输入输出机制实例

本文是针对 控制台输入输出机制 一文的实例说明.相关理论内容建议参考之. 实例a 控制台高层输入输出接口实例 本实例首先使用控制台默认输入输出模式,调用ReadFile和WriteFile函数,用于说明用于控制台的字符串输入输出:之后修改控制台输入模式,关闭行输入模式和回显输入模式,重复使用ReadFile和WriteFile函数.最后再程序退出时恢复控制台默认的输入输出模式及字符颜色. 代码中使用NewLine函数在行输入模式禁用情况下模拟换行处理,即将控制台屏幕缓冲的光标移动到下一行开始位置

SBCL x86 win32版本‘alien callback’的bug及解决方案

前言 SBCL win32版的官方发布版本,最近几个版本(从1.2.8到最新的1.2.13),一直存在一个很烦人的bug,在控制台界面输入Ctrl+C组合键时,SBCL就会异常退出.在SBCL里面,使用Ctrl+C本来可以中断/停止正在运行的程序. 我从1.2.11版本开始注意到有这个问题,在1.2.11之前我使用的1.2.7版本是正常的.现在发布了1.2.13问题仍然没有解决.Google了一下,原来也有人发现了这个问题,并且和SBCL的开发人员有过交流,不过没有找到问题原因.他们的讨论可以参

物理层、、。。。

一.物理层 1.信号 1)信息: 2)数据: 3)信号:信息传递的媒介 4)信号的分类: 模拟信号:连续变化的物理量. 数字信号:不连续的物理量,信号参数也不连续变化,高低固定. 5) 噪声和衰减 6)数字信号的优势 : 抗干扰能力强 适合远距离传输并能保证质量 2.接口 以太网接口: RJ-45水晶头 光纤接口: FC .ST.SC LC 窄体方形光纤接头(目前主流) MT-RJ 3.双绞线 1) 双绞线分类: 屏蔽双绞线 (STP) 线外包裹一层金属网膜,用于电磁环境非常复杂的工业环境中 非

短视频行业竞争加码 开发者点赞趣拍云感恩钜惠活动

一.短视频成为新的创业风口 2016年,短视频超过了图文和组图,成为了今日头条最大的内容形态,日均播放次数超过了10亿次.继第二届头条号创作者大会上宣布对短视频作者投入10亿人民币,今日头条宣布已完成了对移动视频创作者平台Flipagram的全资收购,意味着今日头条正式拿到了全球短视频市场的入场票. 短视频将会是未来非常重要的一个风口.4G-5G时代,流量费用大幅度降低,用手机看视频已经成为新常态.相比图文内容的维度单调,视频本身即是一个立体且更具"IP化"的媒介样态:短视频利用自身可

MySQL 5.7及以上解压缩版本配置安装

来源:http://jingyan.baidu.com/article/8cdccae946133f315513cd6a.html 红色部分为本人添加 MySQL 5.7以上版本的配置和以前有所不同,在这里与大家分享一下经验. 工具/原料 MySQL 5.7及以上版本压缩包 windows 7及更高版本 方法/步骤 解压缩 将下载到的文件解压缩到自己喜欢的位置,例如我自己的位置是D:\Program Files\mysql-5.7.10-winx64 添加环境变量 右键计算机->属性->高级系

安装mysql5.7版本zip安装

解压缩       将下载到的文件解压缩到自己喜欢的位置,例如我自己的位置是D:\Program Files\mysql-5.7.10-winx64添加环境变量       右键计算机->属性->高级系统设置->环境变量:在系统变量里添加MYSQL_HOME环境变量,变量值为MySQL的根目录,例如我的是D:\Program Files\mysql-5.7.10-winx64(原路径有错,已更改,对受误导的网友表示抱歉.谢谢网友"庞大进"的提醒,2016.5.7)