c++ - Windows Unicode 键盘钩子(Hook)

标签 c++ windows unicode keyboard hook

我正在开发一个应用程序,在某些时候需要捕获键盘和鼠标用户输入。我在安装和使用鼠标 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 吗?

最佳答案

关于c++ - Windows Unicode 键盘钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16625580/

相关文章:

c++ - C++中的模板化比较函数

c++ - 当要访问的对象被多次封装时,如何正确使用setter?

c++ - VTK:对齐两个 Actor

c++ - 加速 C++ 练习 4-0

java - 如何使用 PHP 运行批处理文件?

windows - 从 Mercurial 迁移后,Git 在 Windows 11 上无法正确识别带变音符号的文件

PHP MySQL,PHP无法识别MySQL模块已安装

php - 为什么 PHP 脚本在 WAMP/MySQL 服务器中不显示 Unicode 文本

perl - Perl 中的 CRLF 与 Unicode 翻译

vb.net - 在 VB.NET 中检测非英语按键