2010-05-01 59 views
4

如何讀取使用win32 api的按鍵?我也想從國際鍵盤看到它們,比如德國變音器。C++ win32從鍵盤獲取utf8字符

謝謝

+2

你說的是控制檯應用程序還是GUI應用程序?在前一種情況下,在後一種情況下使用'getwchar()'來響應'WM_UNICHAR'消息。另外請注意,不存在「UTF8字符」這樣的內容:「字符」通常表示「Unicode字符」,但Windows文檔使用該術語而不是「UTF-16代碼單元」。 – Philipp 2010-05-01 10:24:08

+0

實際上它應該抓住筆畫,即使它沒有焦點 – ehmmmm 2010-05-01 10:28:07

回答

1

要獲得鍵盤輸入而不管焦點,您可能需要鉤住鍵盤。

請使用WH_KEYBOARD或WH_KEYBOARD_LL查看SetWindowsHookEx。將W添加到Unicode變體的調用中。

3

鍵盤按壓和它們生成的字符之間存在差異。

在最低級別,您可以用GetKeyboardState查詢鍵盤狀態。這通常是鍵盤記錄惡意軟件如何實現的,因爲它需要最少的權限,並且無論焦點在哪裏都能看到所有內容。這種方法的問題(除了需要不斷的輪詢)之外,你必須將鍵盤狀態拼接成擊鍵,然後將鍵盤敲擊到字符流中。你必須知道鍵盤是如何映射的,你已經保持了shift鍵,控制鍵,alt鍵等的狀態。你必須知道自動重複鍵,死鍵和其他可能的複雜情況。

如Jens在他的回答中提到的,如果您有權限可以安裝鍵盤掛鉤。

如果您有注意力,並且您是控制檯應用程序,則可以使用其中一種功能從標準輸入讀取。在Windows上,很難獲得真正的Unicode輸入。您通常會得到所謂的ANSI字符,它們對應於控制檯窗口的當前代碼頁。如果您知道代碼頁,則可以使用MultiByteToWideChar將單字節或多字節輸入轉換爲UTF-16(Windows文檔稱爲Unicode)。從那裏你可以將它轉換爲UTF-8(與WideCharToMultiByte)或任何其他的Unicode編碼你想要的。

如果你有專注,而且你是一個GUI應用程序,你可以看到與WM_KEYDOWN(和朋友)的擊鍵。您也可以使用WM_CHAR(或從WM_UNICHAR的UTF-32)獲得完全解析的UTF-16字符。如果您需要使用UTF-8,則必須進行轉換。