看來,如果您在全局WH_KEYBOARD_LL掛鉤中調用ToAscii()
或ToUnicode()
,並且按下死鎖,它將被「銷燬」。鍵盤掛鉤中的ToAscii/ToUnicode銷燬死鎖
例如,假設您在Windows中將輸入語言配置爲西班牙語,並且您希望在程序中鍵入重音字母。通常情況下,按下單引號鍵(死鍵),然後按字母「a」,然後在屏幕上按預期方式顯示帶重音符號的-。
但是,如果您在低級鍵盤掛接功能中調用ToAscii()
或ToUnicode()
,則此功能無效。看起來,死鑰匙被銷燬,所以沒有重音字母?顯示在屏幕上。取消對上述功能的調用可解決問題......但不幸的是,我需要能夠調用這些功能。
我谷歌搜索了一段時間,雖然很多人似乎有這個問題,但沒有提供好的解決方案。
任何幫助將不勝感激!
編輯:我打電話ToAscii()
在我LowLevelKeyboardProc鉤子函數接收到的虛擬鍵碼和掃描碼轉換成將被顯示在屏幕上,用戶產生的字符。
我試過MapVirtualKey(kbHookData->vkCode, 2)
,但這不像ToAscii()
那樣「完整」例如,如果按Shift + 2,則會得到'2',而不是'@'(或Shift + 2將爲用戶的鍵盤佈局/語言生成的任何內容)。
ToAscii()
是完美的...直到死鎖被按下。
EDIT2:這裏的鉤子函數,用不相干的信息刪除:
LRESULT CALLBACK keyboard_LL_hook_func(int code, WPARAM wParam, LPARAM lParam) {
LPKBDLLHOOKSTRUCT kbHookData = (LPKBDLLHOOKSTRUCT)lParam;
BYTE keyboard_state[256];
if (code < 0) {
return CallNextHookEx(keyHook, code, wParam, lParam);
}
WORD wCharacter = 0;
GetKeyboardState(&keyboard_state);
int ta = ToAscii((UINT)kbHookData->vkCode, kbHookData->scanCode,
keyboard_state, &wCharacter, 0);
/* If ta == -1, a dead-key was pressed. The dead-key will be "destroyed"
* and you'll no longer be able to create any accented characters. Remove
* the call to ToAscii() above, and you can then create accented characters. */
return CallNextHookEx(keyHook, code, wParam, lParam);
}
請顯示ToUnicode()的調用代碼。你在哪裏得到lpKeyState參數? – jdigital 2009-12-27 03:00:02
@jdigital:嗯,我個人打電話給ToAscii,但我也讀過ToUnicode。我的調用基本上是WH_KEYBOARD_LL鉤子函數中的ToAscii(kbHookData-> vkCode,kbHookData-> scanCode,GetKeyboardState(),&lpchar,0)。當ToAscii調用返回-1時,這意味着按下了一個死鍵......並且如我上面解釋的那樣,死鍵被「銷燬」。 – 00010000 2009-12-27 04:14:32
我刪除了我的答案,它是完全不正確的,假設你指的是c-runtime函數來轉換字符串而不是Win32 apis來轉換掃描碼......對不起。 – 2009-12-27 04:31:59