zoukankan      html  css  js  c++  java
  • SetConsoleCtrlHandler 处理控制台消息(转)

    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那么删除钩子。

     

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

  • 相关阅读:
    Day 20 初识面向对象
    Day 16 常用模块
    Day 15 正则表达式 re模块
    D14 模块 导入模块 开发目录规范
    Day 13 迭代器,生成器,内置函数
    Day 12 递归,二分算法,推导式,匿名函数
    Day 11 闭包函数.装饰器
    D10 函数(二) 嵌套,命名空间作用域
    D09 函数(一) 返回值,参数
    Day 07 Day08 字符编码与文件处理
  • 原文地址:https://www.cnblogs.com/qq78292959/p/3097387.html
Copyright © 2011-2022 走看看