2010-01-14 115 views
12

有什麼方法可以在Windows控制檯中獲取關鍵事件?我需要一種方法來快速獲取keydown和keyup事件,而無需GUI。我試過使用getch(),但它沒有得到keyups並等到一個鍵被按下才返回。C++控制檯鍵盤事件

+0

你說「沒有圖形用戶界面」,但大部分的時間(據我所知)在Windows上使用的是窗口內的控制檯。在確實有窗口的情況下,您可以掛鉤該窗口並捕獲其消息。 – Zac 2010-01-14 23:49:44

回答

7

您可以使用GetKeyStateGetAsyncKeyState,但不會給你keydown/keyup事件。它只會告訴你哪些鍵正在關閉。

所以如果你真的需要獲得keydown/keyup事件,你可以安裝一個鉤子。 控制檯窗口具有窗口句柄,該窗口句柄由Windows中的代碼和消息泵擁有,該消息泵也由Windows中的代碼擁有。

您可以通過使用GetConsoleWindow獲得控制檯窗口的窗口句柄。然後使用SetWindowsHookEx安裝WH_CALLWNDPROC掛鉤來偵聽發送到控制檯窗口的消息。

您可以嘗試使用WH_MSGFILTER掛鉤。我不知道這是否適用於控制檯窗口,但它會產生較少的消息,如果它能夠被忽略。

8

使用ReadConsoleInput() API。注意種類KEY_EVENT的事件。這不適用於所有keydown事件(Ctrl-key,shift-key,Pause-key不能被讀取),但大部分都可以被讀取。使用GetNumberOfConsoleInputEvents來避免阻塞。

1

有很多種方法。 GetKeyboardState將是最明顯的一個。

2

我只是好奇,怎麼會有這樣一個合乎邏輯的問題沒有任何解釋谷歌, 所以人們必須在這裏問它。所以我用Google搜索:「鍵盤事件控制檯應用程序」和 你猜怎麼着......前2個鏈接是有趣的(但不幸的是,不完全回答你的問題):

+3

我搜索了同樣的東西猜測什麼...第三個鏈接指向這個頁面。 – avakar 2010-01-14 23:07:47