我正在开发一个在某些时候需要捕获键盘和鼠标用户输入的应用程序。我安装和使用鼠标钩没有问题,但键盘工作不正常。我需要从多个键盘布局中捕获宽字符。我发现了一些相关但没有解决我的问题:https ://stackoverflow.com/questions/15976108/keyboard-hook-not-capturing-unicode-in-other-threads
这就是我没有不必要的东西
赢主:
//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 两次,死键被消耗,我只是显示字符。
我想知道为什么要修改用户输入,因为我没有更改回调调用者提供的任何参数。低级钩子不能使用 unicode 吗?