根據您的具體要求,您有多種選擇。如果你只是想忽略按Ctrl +ç你可以撥打SetConsoleCtrlHandler
傳遞NULL
爲HandlerRoutine
參數:
int _tmain(int argc, _TCHAR* argv[])
{
SetConsoleCtrlHandler(NULL, TRUE);
// do work
return 0;
}
這將刪除所有的信號處理程序。要終止此應用程序,您必須實施自定義邏輯以確定何時關閉。
如果你想處理按Ctrl +ç你有兩種選擇:設置的信號處理程序或轉嫁給普通鍵盤操作的鍵盤輸入。
設置處理程序與上面的代碼類似,但不是將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
-loop內部。信號處理程序形成一個鏈接列表,其中處理函數以最後一次註冊,首先調用的方式調用,直到其中一個處理程序返回TRUE
。如果沒有任何處理程序返回TRUE,則調用默認處理程序。控制檯的默認處理程序在處理時調用ExitProcess
Ctrl + C。
如果你想防止任何預處理和處理按Ctrl +ç作爲普通鍵盤輸入,而不是你必須通過調用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鍵 + Ç由系統不再處理並傳遞到像普通鍵盤輸入控制檯。可以使用ReadConsoleInput
或ReadFile
來閱讀。
免責聲明:上述內容已在Windows 8 64位上進行了測試,編譯爲32位和64位Release和Debug配置。
什麼'SetConsoleCtrlHandler'返回? – Caesar
SetConsoleCtrlHandler的返回值是什麼?你沒有檢查錯誤,btw – lpapp
你確定'ConsoleHandler'函數可以運行嗎?如果你在調試器中運行程序並在其中設置斷點,它會在斷點處停止嗎? –