本节显示了用于安装控制处理程序的SetConsoleCtrlHandler函数的示例。
当接收到CTRL + C信号时,控制处理程序返回TRUE,表示已处理该信号。这样做可以防止其他控件处理程序被调用。
当接收到CTRL_CLOSE_EVENT信号时,控制处理程序返回TRUE,导致系统显示一个对话框,使用户可以选择终止进程并关闭控制台或允许进程继续执行。如果用户选择不终止进程,则当进程终止时,系统关闭控制台。
当接收到CTRL + BREAK,CTRL_LOGOFF_EVENT或CTRL_SHUTDOWN_EVENT信号时,控制处理程序返回FALSE。这样做会使信号传递到下一个控制处理函数。如果没有其他控制处理程序已经注册,或者没有注册的处理程序返回TRUE,将使用默认处理程序,导致进程终止。
BOOL CtrlHandler(DWORD fdwCtrlType) {
switch(fdwCtrlType){
/ *处理CTRL + C信号。*/
case CTRL_C_EVENT:
Beep(1000, 1000);
return TRUE;
/ * CTRL + CLOSE:确认用户要退出。*/
case CTRL_CLOSE_EVENT:
return TRUE;
/ *将其他信号传递给下一个处理程序。*/
case CTRL_BREAK_EVENT:
case CTRL_LOGOFF_EVENT:
case CTRL_SHUTDOWN_EVENT:
默认:
return FALSE;
}
}
VOID main(void){
BOOL fSuccess;
fSuccess = SetConsoleCtrlHandler(
(PHANDLER_ROUTINE)CtrlHandler,/ *处理函数* /
TRUE); /* add to list */
如果(!fSuccess)
MyErrorExit("Could not set control handler");