似乎如果您在全局 WH_KEYBOARD_LL 钩子中调用ToAscii()
或ToUnicode()
同时按下死键,它将被“销毁”。
例如,假设您已将 Windows 中的输入语言配置为西班牙语,并且您想在程序中键入带重音符号的字母á。通常,您会按单引号键(死键),然后按字母“a”,然后在屏幕上按预期显示带重音符号的á 。
但是,如果您调用ToAscii()
或ToUnicode()
在低级键盘挂钩函数中,这将不起作用。似乎死键已被破坏,因此屏幕上没有重音字母á出现。删除对上述函数的调用解决了这个问题......但不幸的是,我需要能够调用这些函数。
我用谷歌搜索了一段时间,虽然很多人似乎有这个问题,但没有提供好的解决方案。
任何帮助将非常感激!
编辑:我正在调用将我的LowLevelKeyboardProcToAscii()
挂钩函数中收到的虚拟键代码和扫描代码转换为将在屏幕上为用户显示的结果字符。
我试过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);
}