2012-08-23 62 views
0

美好的一天。有需要監視鍵入的文本,即沒有按鍵,但是派生的字符。Windows鍵盤記錄。 WM_CHAR消息在各種應用程序中的特徵

在開始時,我使用原始輸入法獲取按下按鍵的虛擬按鍵代碼,但由於未能將虛擬按鍵代碼正確轉換爲字符,因此必須放棄此決定。

MapVirtualKeyEx + LoadKeyboardLayout - 沒有給出所需的效果,即如果通過調用LoadKeyboardLayout加載俄羅斯佈局,則MapVirtualKeyEx仍然返回代碼0x41的拉丁語A.

於是我開始使用hook WM_GETMESSAGE。

if (nCode < 0) 
    return CallNextHookEx(NULL, nCode, wParam, lParam); 

// WH_GETMESSAGE 
if (nCode == HC_ACTION) 
{ 
    PMSG pMsg = (PMSG)lParam; 
    if (pMsg != NULL) 
    { 
     if ((pMsg->message == WM_CHAR)||(pMsg->message == WM_UNICHAR)) 
     { 
      keyEntry.character = pMsg->wParam; 
      ipc->SendData(&keyEntry, sizeof(CHARENTRY)); 
     }; 
    }; 
}; 

return CallNextHookEx(NULL, nCode, wParam, lParam); 

一切工作正常,包括與死鑰匙的字符。

但是,當我試着輸入一個Visual Studio的編輯文本,問題發生:

  • 對於一個按鍵來了兩個相同的消息WM_CHAR;
  • 對於西里爾文字符,值WM_CHAR-> wParam與鍵入的字符不匹配,對於拉丁語 - 沒事。

如何將虛擬鍵碼轉換爲考慮輸入文字輸入語言的字符+能夠招募複合字符(例如:ô)。或者告訴我如何用鉤子解決版本中的問題。預先

感謝)

回答

1

鍵盤生成兩個掃描代碼當用戶鍵入一個鍵 - 一個當用戶當用戶釋放鍵按壓鍵和另一個。

來源:關於鍵盤輸入 - http://msdn.microsoft.com/en-us/library/windows/desktop/ms646267(v=vs.85).aspx

WM_CHAR只會是UTF-16,如果應用程序被編譯爲Unicode作爲 的字符編碼(即MBCS和UNICODE之間的差)。如果您的應用程序使用MBCS(多字節字符集)構建,則 系統將使用當前系統代碼頁將Unicode 字符轉換爲「Ansi」(用引號引起)併發送該字符。

因此請檢查您的編譯設置,其中編碼您的應用的字符編碼爲 配置爲。

來源:Unicode和多字節字符集(MBCS)支持:http://msdn.microsoft.com/en-us/library/ey142t48(v=vs.80).aspx