Windows Unicode键盘钩子

时间:2013-05-18 14:52:09

标签: c++ windows unicode keyboard 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

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吗?

1 个答案:

答案 0 :(得分:-1)

关于死锁,ToUnicodeEx被破坏了。这就是您所寻找的:https://code.google.com/p/jnativehook/source/browse/tags/1.1.4/src/native/windows/WinUnicodeHelper.c