【发布时间】:2013-05-18 14:52:09
【问题描述】:
我正在开发一个在某些时候需要捕获键盘和鼠标用户输入的应用程序。我安装和使用鼠标钩没有问题,但键盘工作不正常。 我需要从多个键盘布局中捕获宽字符。 我发现了一些相关但没有解决我的问题: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 文档尝试过的内容。 推送到缓冲区接收 wchar_t 指针并将其存储在用作缓冲区的 wstring 中,然后转储到 wofstream 中。
会发生什么:
如果我调用 ToUnicodeEx 一次,用户输入会被修改,并且任何死键都会为他显示两次:例如,在国际英语布局中,您按 ' 然后按 a 打印一个 á,它会显示:''一种。应用程序关闭后,用户输入恢复正常。
如果我调用 ToUnicodeEx 两次,死键被消耗,我只是显示字符。
我想知道为什么要修改用户输入,因为我没有更改回调调用者提供的任何参数。 低级钩子不能使用 unicode 吗?
【问题讨论】:
-
你不能使用低级键盘钩子来完成这项工作。回调在您的进程中运行,而不是在将要获得击键的进程中运行。您检索到错误的键盘状态。您无法获取其他进程的键盘状态。
标签: c++ windows unicode keyboard hook