天天加油 - 助您成才
Win32编程中如何处理控制台消息
您正在看的经验技巧是:Win32编程中如何处理控制台消息。

这篇文章讨论如何处理所有的控制台消息。

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

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

  • 上一篇教程:
  • 下一篇教程:
  • 排行

    1. Winodws下Apache+PHP+MySQL的安装
    2. 快照 RegSnap
    3. HKEY_USER 根键(一)
    4. 20:8!超宽屏Vista截图抢鲜
    5. Vista服务优化攻略
    6. Windows Vista:透视未来桌面远景
    7. 不同:Windows Vista的关机组合快
    8. 如何恢复Windows Vista/XP双启动
    9. Vista系列技巧:Vista侧边栏安装
    10. Vista解惑之防火墙10个注意事项
    11. 官方谈Vista OEM盗版激活 承认破
    12. 仅需三分钟 便可轻松破解Vista登
    13. 浅述单核CPU跑Vista 占用率高的原
    14. Vista Areo界面全攻略
    15. 从1.01到Vista Windows启动画面图
    16. 新手不用慌:Vista官方驱动程序大
    1. 解密Windows Vista 5270中的捆绑
    2. Windows Vista SP1截图曝光
    3. Vista启动音乐:18个月就为了这4秒
    4. Windows Vista系统优化软件新版抢
    5. Windows Vista操作系统八大特性抢
    6. 全球首个Windows Vista新闻软件亮
    7. 为何失败 简述Windows Vista中的
    8. 为非主流主机优化 打造最强Vista
    9. Vista 竟是WIN 95以来漏洞最多系
    10. 对Win Vista防火墙进行高级配置
    11. 革命性技术:Win Vista可记录用户
    12. Windows Vista 最佳改进:拷贝文
    13. WindowsVista操作系统使用疑问解
    14. 自己动手丰衣足食 Vista激活不求
    15. 使用BCDEdit修改Windows Vista启
    16. 负责人专访:Windows Vista游戏更
    1. Winodws下Apache+PHP+MySQL的安装
    2. 快照 RegSnap
    3. HKEY_USER 根键(一)
    4. 20:8!超宽屏Vista截图抢鲜
    5. Vista服务优化攻略
    6. 妙用Windows9x的Desktop.ini文件
    7. Windows Vista系统优化软件新版抢
    8. Windows Vista操作系统八大特性抢
    9. 为何失败 简述Windows Vista中的
    10. WindowsVista操作系统使用疑问解
    11. 使用BCDEdit修改Windows Vista启
    12. 如何从计算机上删除 Windows XP 
    13. 双机热备、双机互备和双机双工三
    14. sap basis系列之三
    15. 给freebsd系统增加一个新硬盘
    16. 我教你学之IE6.0性能注册表修改实

    最近更新

  • 推荐阅读
  • 经验技巧《Win32编程中如何处理控制台消息》Win32编程中如何处理控制台消息