我正在开发一个应用程序,在某些时候需要捕获键盘和鼠标用户输入。我没有安装和使用鼠标钩的问题,但键盘不能正常工作。 我需要从多个键盘布局中捕获宽字符。 我发现了一些相关的但没有解决我的问题: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
KeyboardProc:
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文档显示了我已经尝试过的内容。 push to buffer接收一个wchar_t指针并将其存储在用作缓冲区的wstring中,该转储在wofstream中转储。
会发生什么:
如果我调用ToUnicodeEx一次,则修改用户输入并为他显示两次死锁:例如,在国际英语布局中,按'然后按a打印á,它显示:''一个。关闭应用程序后,用户输入恢复正常。
如果我两次调用ToUnicodeEx,就会消耗死锁,我只会显示char。
我想知道为什么修改了用户输入,因为我没有更改回调调用者给出的任何参数。 低级钩子不可能是unicode吗?
答案 0 :(得分:-1)
关于死锁,ToUnicodeEx被破坏了。这就是您所寻找的:https://code.google.com/p/jnativehook/source/browse/tags/1.1.4/src/native/windows/WinUnicodeHelper.c