再网上找了个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;
}