SetConsoleCtrlHandler 函数

再网上找了个SetConsoleCtrlHandler例子。发现按Ctrl + C时虽然不是关闭窗口,但另一段程序按Ctrl+C却关闭了。

开始还为是switch case语句有误,真正的原因是:当处理函数返回FALSE时,系统将会处理钩子函数而返回TRUE时,完全时用户处理。

下面是一段处理的比较好例子:

 

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

typedef void Sigfunc(int);
void sig_exit( int inSigno );

typedef Sigfunc *SigfuncPtr;


/* under windows, emulate unix signals */
enum {
    SIGINT,
    SIGTERM,
    SIGPIPE,
    _NSIG
};
static SigfuncPtr handlers[ _NSIG ] = { 0};

BOOL WINAPI sig_dispatcher( DWORD type ) {
    SigfuncPtr h = NULL;
    int signo;

    switch ( type ) {
        case CTRL_C_EVENT:
            signo = SIGINT;
            printf( "Ctrl-C event\n\n" );
            Beep( 750, 300 ); //param 1 :fre, param2: time ms 
            h = handlers[ SIGINT ];
            printf("after handlers sigint\n");
            sleep(5000);
            break;

        case CTRL_CLOSE_EVENT: //return( TRUE ); 
        case CTRL_LOGOFF_EVENT:
        case CTRL_SHUTDOWN_EVENT:
            signo = SIGTERM;
            h = handlers[ SIGTERM ];
            break;

        default:
            break;
    }
    //下面这段话是很重要的:1.  确保了sig_dispatcher有确定的返回值
    //  2. 如果没段话,返回 return不确定
    //  3. 不处理返回FASLE,则系统将会否处理; 否则返回TURE 
   if ( h != NULL ) {
        // call the signal handler
        h( signo );
        return TRUE;
    } else {
        return FALSE;
    
}

int main(int argc, char *argv[])
{
  if(SetConsoleCtrlHandler( sig_dispatcher, TRUE ))
  {
  while( 1 )
  {printf(" here is while loop\n"); 
   sleep(1000);
  } 
}
  //system("PAUSE");	
  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值