2016-09-26 78 views
3

我使用ReadConsoleInputW來讀取Windows 10控制檯輸入。我希望能夠檢測何時按下Ctrl + S被按下。使用我的代碼,我可以檢測按Ctrl +Q沒有問題,但我不按Ctrl +小號看到什麼。是Ctrl + S甚至可檢測?Windows控制檯中的Ctrl-S輸入事件(ReadConsoleInputW)

的下面是INPUT_RECORD序列按壓Ctrl鍵 + 小號幾次,當我讀,隨後Ctrl鍵 + Q

Key { key_down: true, repeat_count: 1, key_code: 17, scan_code: 29, wide_char: 0, control_key_state: 40 } 
Key { key_down: true, repeat_count: 1, key_code: 17, scan_code: 29, wide_char: 0, control_key_state: 40 } 
Key { key_down: true, repeat_count: 1, key_code: 17, scan_code: 29, wide_char: 0, control_key_state: 40 } 
Key { key_down: true, repeat_count: 1, key_code: 17, scan_code: 29, wide_char: 0, control_key_state: 40 } 
Key { key_down: true, repeat_count: 1, key_code: 17, scan_code: 29, wide_char: 0, control_key_state: 40 } 
Key { key_down: true, repeat_count: 1, key_code: 17, scan_code: 29, wide_char: 0, control_key_state: 40 } 
Key { key_down: true, repeat_count: 1, key_code: 17, scan_code: 29, wide_char: 0, control_key_state: 40 } 
Key { key_down: true, repeat_count: 1, key_code: 17, scan_code: 29, wide_char: 0, control_key_state: 40 } 
Key { key_down: true, repeat_count: 1, key_code: 81, scan_code: 16, wide_char: 17, control_key_state: 40 } 

如果重要,這是在Rust使用wio

+1

您正在使用哪種終端模擬器?你使用'cmd.exe'嗎?電源外殼?像bash一樣?終端模擬器程序是否可以攔截該組合鍵? – Shepmaster

+2

您可以嘗試使用['SetConsoleMode'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms686033(v = vs.85).aspx)禁用'ENABLE_PROCESSED_INPUT'? – wimh

+0

我正在使用'cmd.exe'。我會嘗試在今晚禁用'ENABLE_PROCESSED_INPUT'。謝謝。 – oconnor0

回答

3

調用SetConsoleModeENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | ENABLE_EXTENDED_FLAGS作爲第二個參數(因此禁用ENABLE_PROCESSED_INPUT)做了竅門。

+0

+1,因爲你幫我找到了解決方案。但是,我發現ENABLE_PROCESSED_INPUT不是罪魁禍首,請參閱我的答案。 – ThreeStarProgrammer57

0

oconnor0的回答幫我找到了解決辦法。

但是,我無法通過禁用ENABLE_PROCESSED_INPUT來獲取ctrl-s事件,所以我嘗試僅使用ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | ENABLE_EXTENDED_FLAGS,正如oconnor0所示。這工作,但這意味着ENABLE_PROCESSED_INPUT是不是污水!

所以,我想:

//This didn't work 
if (!GetConsoleMode(hConsoleInput, &lpMode)) Error(); 
lpMode &= ~(ENABLE_PROCESSED_INPUT); 
if (!SetConsoleMode(hConsoleInput, lpMode)) Error(); 

//This worked 
if (!GetConsoleMode(hConsoleInput, &lpMode)) Error(); 
lpMode &= ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT); 
if (!SetConsoleMode(hConsoleInput, lpMode)) Error(); 

禁用ENABLE_ECHO_INPUT迫使你禁用ENABLE_ECHO_INPUT(請參閱MSDN),但它是不是罪魁禍首,因爲:

//This didn't work either 
if (!GetConsoleMode(hConsoleInput, &lpMode)) Error(); 
lpMode &= ~(ENABLE_PROCESSED_INPUT | ENABLE_ECHO_INPUT); 
if (!SetConsoleMode(hConsoleInput, lpMode)) Error(); 

因此,這意味着ENABLE_LINE_INPUT是罪魁禍首!

目前還不清楚爲什麼,但:

ENABLE_LINE_INPUT 0×0002的的ReadFile或ReadConsole函數返回只有當一個回車符讀 。如果禁用此模式爲 ,則當可用的一個或多個字符爲 時,函數將返回。