gpt4 book ai didi

C++ ToUnicodeEx() 无法识别 shift 键,除非我有一个 messgaebox()

转载 作者:行者123 更新时间:2023-11-28 03:41:31 25 4
gpt4 key购买 nike

我在用 C++ 编写键盘钩子(Hook)时遇到了一些麻烦。

我可以读取击键,但我试图在按下 shift 键时使用 ToUnicodeEx() 转换击键。在我到目前为止的代码中,我有

i = ToUnicodeEx(keyboard.vkCode, keyboard.scanCode, (PBYTE)&keyState, (LPWSTR)&keybuff, sizeof(keybuff) / 16, 0,keyboardlayout);
MessageBox(MainnhWnd,keybuff, L"message", MB_OK | MB_ICONEXCLAMATION);

当我按下 Shift+2 时,这个“MessageBox”行会弹出两个消息框,第一个对于 shift 键是空白的,第二个显示一个“@”字符。这是预期的。

但如果我删除此消息框,ToUnicodeEx() 函数会转换击键,就好像没有使用 shift 键一样。我可以通过设置断点、使用命中计数器或将字符输出到程序窗口中的编辑框来看到这一点。

此外,当我包含 MsgBox 行并使用 CapLock 时,我的字母会相应更改,但在我删除 msgbox 行后,它仅在我的程序启动时使用大写锁定状态(大写锁定在程序启动时打开,所有字母都是大写,反之亦然,当程序启动时所有字母都是小写的,即使我改变了大写锁定状态)

任何人都知道为什么我的钩子(Hook)只记得开始时的键盘状态,除非我包含 msgbox?

我的钩子(Hook)设置如下:

theHook = SetWindowsHookEx ( WH_KEYBOARD_LL, (HOOKPROC) KeyEvent, exe, 0);

我的钩子(Hook)回调函数是:

DLLEXPORT LRESULT CALLBACK KeyEvent(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode>=0) {
int i = 0;
KBDLLHOOKSTRUCT keyboard;
WCHAR keybuff[256]= {0};

if ((wParam == WM_KEYDOWN)|| (wParam == WM_SYSKEYDOWN)||(wParam == WM_SYSKEYUP)) {
keyboard = *((KBDLLHOOKSTRUCT*)lParam);
if (keyboard.vkCode == VK_RETURN) {
i += wsprintf (((LPWSTR)keybuff + i),L"[Return]\r\n");
}
else {
HKL keyboardlayout = GetKeyboardLayout(0);
GetKeyboardState((PBYTE)&keyState);
i = ToUnicodeEx(keyboard.vkCode, keyboard.scanCode, (PBYTE)&keyState, (LPWSTR)&keybuff, sizeof(keybuff) / 16, 0,keyboardlayout);

MessageBox(MainnhWnd,keybuff, L"message", MB_OK | MB_ICONEXCLAMATION);
}
if (keybuff>0) {
addToEditBox(keybuff);
}
}
}
return CallNextHookEx(theHook, nCode, wParam, lParam);
}

最佳答案

根据 ToUnicodeEx function 的文档,您应该提供一个指向包含当前键盘状态的 256 字节数组的指针 (const BYTE *lpKeyState)。数组中的每个元素(字节)都包含一个键的状态。如果设置了一个字节的高位,则 key 为down。

在你调用 ToUnicodeEx 之前,你应该像这样设置这个数组(伪代码):

enum Keys
{
ShiftKey = 16, // shift
ControlKey = 17, // ctrl
Menu = 18, // alt
Capital = 20, // caps lock
};

BYTE keyState[256]= {0};

if (Control key down)
keyState[Keys::ControlKey] = 0x80;

if (Shift key down)
keyState[Keys::ShiftKey] = 0x80;

if (Alt key down)
keyState[Keys::Menu] = 0x80;

if (Caps lock ON)
keyState[Keys::Capital] = 0x01;

当设置了 keyState 数组后,您可以调用:

ToUnicodeEx(keyboard.vkCode, keyboard.scanCode, (PBYTE)&keyState, (LPWSTR)&keybuff, sizeof(keybuff) / 16, 0,keyboardlayout);

我一直在像这样使用 ToUnicodeEx 函数,它运行良好。
希望这对您有所帮助;)

关于C++ ToUnicodeEx() 无法识别 shift 键,除非我有一个 messgaebox(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9046817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com