2016-09-26 2 views
3

Windowsのコンソール入力を読み取るのにReadConsoleInputWを使用しています。 Ctrl + を押すと検出できるようにしたい。私が持っているコードを使用して、私は問題なくはCtrl +Qを検出することができますが、私はCtrlキー+Sのために何を見ていませんよ。 Ctrl + も検出できますか?ReadConsoleInputWを含むWindowsコンソールのCtrl-S入力イベント

以下はCtrl +Q続いはCtrl +S数回押したときに私が読んINPUT_RECORDの配列です。

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

ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | ENABLE_EXTENDED_FLAGSを第2引数として呼び出すと(ENABLE_PROCESSED_INPUTが無効になります)、このトリックが実行されました。

+0

+1、私が解決策を見つける手助けをしてくれました。しかし、私はENABLE_PROCESSED_INPUTが犯人ではないことを知りました。私の答えを見てください。 – ThreeStarProgrammer57

0

oconnor0の回答は私に解決策を教えてくれました。

しかし、私はENABLE_PROCESSED_INPUTを無効にすることでctrl-sイベントを取得できませんでした。したがって、oconnor0の推奨に従ってENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | ENABLE_EXTENDED_FLAGSを使用してみました。これはうまくいったが、これはENABLE_PROCESSED_INPUTが犯人ではないことを意味する!

だから私が試した:(MSDNを参照)ENABLE_ECHO_INPUTを無効にするENABLE_ECHO_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_LINE_INPUTであることを意味

//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 0×0002ザ・ReadFile関数やReadConsole機能が復帰文字が読み込まれるだけ を返します。このモードが を無効にすると、1つ以上の文字が であるときに関数が戻ります。

関連する問題