根据您的具体要求,您有多种选择。如果你只是想忽略Ctrl+C你可以调用SetConsoleCtrlHandler
传递NULL
作为HandlerRoutine
参数:
int _tmain(int argc, _TCHAR* argv[])
{
SetConsoleCtrlHandler(NULL, TRUE);
// do work
return 0;
}
这将删除所有信号处理程序。要终止此应用程序,您必须实现自定义逻辑以确定何时关闭。
如果要处理Ctrl+C您有两个选择:为信号设置处理程序或将键盘输入传递给常规键盘处理。
设置处理程序类似于上面的代码,但不是NULL
作为处理程序传递,而是提供您自己的实现。
#include <windows.h>
#include <stdio.h>
volatile bool isRunnung = true;
BOOL WINAPI HandlerRoutine(_In_ DWORD dwCtrlType) {
switch (dwCtrlType)
{
case CTRL_C_EVENT:
printf("[Ctrl]+C\n");
isRunnung = false;
// Signal is handled - don't pass it on to the next handler
return TRUE;
default:
// Pass signal on to the next handler
return FALSE;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
SetConsoleCtrlHandler(HandlerRoutine, TRUE);
printf("Starting\n");
while ( isRunnung ) {
Sleep(0);
}
printf("Ending\n");
return 0;
}
此应用程序的输出是:
Starting
[Ctrl]+C
Ending
请注意,无论主循环内的代码如何,都会执行清理代码while
。信号处理程序形成一个链表,其中处理程序函数在最后注册、第一次调用的基础上被调用,直到其中一个处理程序返回TRUE
。如果没有任何处理程序返回 TRUE,则调用默认处理程序。ExitProcess
处理Ctrl+时控制台调用的默认处理程序C。
如果您想阻止任何预处理并将Ctrl+处理C为常规键盘输入,则必须通过调用来更改控制台模式SetConsoleMode
。
#include <windows.h>
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwMode = 0x0;
GetConsoleMode( GetStdHandle(STD_INPUT_HANDLE), &dwMode );
// Remove ENABLE_PROCESSED_INPUT flag
dwMode &= ~ENABLE_PROCESSED_INPUT;
SetConsoleMode( GetStdHandle(STD_INPUT_HANDLE), dwMode );
while ( true ) {
// Ctrl+C can be read using ReadConsoleInput, etc.
}
return 0;
}
一旦ENABLE_PROCESSED_INPUT
标志被删除Ctrl+C不再被系统处理并像常规键盘输入一样传递给控制台。可以使用ReadConsoleInput
或读取ReadFile
。
免责声明:以上内容已在 Windows 8 64 位、针对 32 位和 64 位、Release 和 Debug 配置编译。