我正在开发一个应用程序,在某些时候需要捕获键盘和鼠标用户输入。我在安装和使用鼠标 Hook 时没有遇到任何问题,但键盘无法正常工作。 我需要从多个键盘布局中捕获宽字符。 我找到了一些相关但没有解决我的问题:https://stackoverflow.com/questions/15976108/keyboard-hook-not-capturing-unicode-in-other-threads
这就是我没有不必要的东西的东西
WinMain:
//Set the hook, with threadId = 0
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hInstance, 0);
HKL keyboardLayout = GetKeyboardLayout(0);
//All the window and message queue code
键盘处理:
WCHAR unicodeChar;
BYTE keyboardLayout[256];
KBDLLHOOKSTRUCT* keyParam = (KBDLLHOOKSTRUCT*) lParam;
if(code < 0)
return CallNextHookEx(hHook, code, wParam, lParam);
if(wParam == WM_KEYDOWN)
{
GetKeyboardState(keyboardState);
int translation = ToUnicodeEx(keyParam->vkCode, keyParam->scanCode, keyboardState, &unicodeChar, 1, 0, keyboardLayout);
translation = ToUnicodeEx(keyParam->vkCode, keyParam->scanCode, keyboardState, &unicodeChar, 1, 0, keyboardLayout);
if(translation == 0 )//|| translation == -1)
return 0;
PushToBuffer(&unicodeChar);
}
//return CallNextHookEx(hHook, code, wParam, lParam);
return 0;
我留下了注释代码以显示我已经根据我提到的帖子和 MSDN 文档尝试过的内容。 推送到缓冲区接收一个 wchar_t 指针并将其存储在用作缓冲区的 wstring 中,该缓冲区转储到 wofstream 中。
发生了什么:
如果我调用 ToUnicodeEx 一次,用户输入将被修改,任何死键都会为他显示两次:例如,在国际英语布局中,您按 ' 然后按 a 打印 á,它显示:'' A。关闭应用程序后,用户输入恢复正常。
如果我调用 ToUnicodeEx 两次,则 dead-key 被消耗,我只是显示字符。
我想知道为什么要修改用户输入,因为我没有更改回调调用者提供的任何参数。 低级钩子(Hook)不可能使用 unicode 吗?
最佳答案
ToUnicodeEx 在涉及死键时被破坏。这就是您要找的:https://code.google.com/p/jnativehook/source/browse/tags/1.1.4/src/native/windows/WinUnicodeHelper.c
关于c++ - Windows Unicode 键盘钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16625580/