如何监视使用 SHIFT Win32 LowLevelKeyboardProc 按下的按键

问题描述 投票:0回答:1

我有一个程序可以记录所有按键操作。目前,我正在使用 ToUnicode 将虚拟键代码转换为其各自的等效字符。

我遇到的唯一问题是这些字符没有显示正确的值,例如“!”或分别按下 Shift + 1 和 Shift + 4 时的“$”。

我当前的代码如下:

#include <Windows.h>
#include <WinUser.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
    static BOOL isUppercase = FALSE;
    if (nCode >= 0 && wParam == WM_KEYDOWN) {
        PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
        BYTE buf[256];
        GetKeyboardState(buf);
        WCHAR charBuf[5];
        int key = ToUnicode(p->vkCode, p->scanCode, buf, charBuf, sizeof(charBuf), 2);
        printf("[%s]", charBuf);
    }
    return CallNextHookEx(0, nCode, wParam, lParam);
}

int main() {
    HHOOK hook = SetWindowsHookExA(WH_KEYBOARD_LL, LowLevelKeyboardProc, NULL, 0);
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessageW(&msg);
    }
    UnhookWindowsHookEx(hook);
    return 0;
}

我知道我可以使用一些 switch 语句来检查虚拟键是否与 Shift 的虚拟键匹配,并在按下 Shift 后打印按键各自的值,但我想避免这种情况。

我哪里出错了?

c winapi
1个回答
0
投票

ToUnicode
有这个功能。正如我在评论中所说,您需要将键盘状态
lpKeyState
设置为
ToUnicode

参考文献:https://stackoverflow.com/a/62783003代码片段

#include <Windows.h>

int main()
{
    UINT code = 0x31;// 1 Key
    {
        //
        // Map virtual key to scan code
        //
        UINT scanCode = 0;
        scanCode = MapVirtualKey(code, 0);

        //
        // Keyboard state
        //
        BYTE abKbdState[256] = {};
        if (!GetKeyboardState(abKbdState))
        {
            return 0;
        }
        abKbdState[VK_SHIFT] = 0x80;

        //
        // Map virtual key to character code
        //
        WCHAR wch[10] = {};
        if (ToUnicode(code, scanCode, abKbdState, wch, 10, 0) == 1)
        {
            return 0;
        }

    }
    return 0;
}

© www.soinside.com 2019 - 2024. All rights reserved.