C++ Windows Unicode键盘挂钩

C++ Windows Unicode键盘挂钩,c++,windows,unicode,keyboard,hook,C++,Windows,Unicode,Keyboard,Hook,我正在开发一个应用程序,在某些情况下需要捕获键盘和鼠标用户输入。我在安装和使用鼠标挂钩方面没有问题,但键盘工作不正常。 我需要从多个键盘布局中捕获宽字符。 我发现了一些相关的东西,但没有解决我的问题: 这就是我没有必要的东西 温曼: //Set the hook, with threadId = 0 hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hInstance, 0); HKL keyboardLayout = GetKeyb

我正在开发一个应用程序,在某些情况下需要捕获键盘和鼠标用户输入。我在安装和使用鼠标挂钩方面没有问题,但键盘工作不正常。 我需要从多个键盘布局中捕获宽字符。 我发现了一些相关的东西,但没有解决我的问题:

这就是我没有必要的东西

温曼:

//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;
WCHAR-unicodeChar;
字节键盘布局[256];
KBDLLHOOKSTRUCT*keyParam=(KBDLLHOOKSTRUCT*)LPRAM;
如果(代码<0)
返回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);
如果(翻译==0)/| |翻译==-1)
返回0;
普什托布费尔(和unicodeChar);
}
//返回CallNextHookEx(hHook、code、wParam、lParam);
返回0;
我留下了注释代码,以显示我已经根据我提到的帖子和MSDN文档尝试过的内容。 push-to-buffer接收一个wchar\u t指针并将其存储在用作缓冲区的wstring中,该wstring转储在wofstream中

发生了什么:

如果我给ToUnicodeEx打一次电话,用户输入会被修改,任何无效键都会为他显示两次:例如,在国际英语版面中,按“然后a”来打印aá,它会显示:“a”。应用程序关闭后,用户输入恢复正常

如果我调用ToUnicodeEx两次,就会使用死键,我只需显示字符

我想知道为什么要修改用户输入,因为我没有更改回调调用方给出的任何参数。
对于低级钩子,unicode是不可能的吗?

ToUnicodeEx在涉及到死键时会被破坏。这就是你想要的:

你不能用低级键盘挂钩来实现这一点。回调在您的进程中运行,而不是在将要获得击键的进程中运行。您检索到错误的键盘状态。无法获取其他进程的键盘状态。