带有ReadConsoleInputW的Windows控制台中的Ctrl-S输入事件

时间:2016-09-26 05:44:38

标签: winapi rust console-application

我正在使用ReadConsoleInputW来阅读Windows 10控制台输入。我希望能够检测何时按下 Ctrl + S 。使用我的代码,我可以毫无问题地检测 Ctrl + Q ,但我没有看到 Ctrl + 取值。是 Ctrl + S 甚至可以检测到吗?

以下是我按 Ctrl + S 几次时读取的INPUT_RECORD序列,然后是 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 }

如果重要,请使用wio在Rust中。

2 个答案:

答案 0 :(得分:3)

使用SetConsoleMode作为第二个参数调用ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | ENABLE_EXTENDED_FLAGS(从而禁用ENABLE_PROCESSED_INPUT)就可以了。

答案 1 :(得分:2)

oconnor0的答案帮助我找到了解决方案。

但是,我无法通过禁用ENABLE_PROCESSED_INPUT来获取ctrl-s事件,因此我尝试仅使用oconnor0建议的ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | ENABLE_EXTENDED_FLAGS。这很有效,但这意味着ENABLE_PROCESSED_INPUT不是culrpit!

所以我试过了:

//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 0x0002 ReadFile或ReadConsole函数返回   仅当读取回车字符时。如果是这种模式   禁用,当一个或多个字符为时,函数返回   可用。