【问题标题】:SetWindowsHookEx - difference between VK_LSHIFT and "Search" keyboard buttonSetWindowsHookEx - VK_LSHIFT 和“搜索”键盘按钮之间的区别
【发布时间】:2020-01-18 12:47:38
【问题描述】:

我使用 SetWindowsHookEx 来捕捉键盘事件

SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0)

这里是 HookCallback

LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode >= 0)
    {
        // the action is valid: HC_ACTION.
        if (wParam == WM_KEYDOWN)
        {
            kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
            printf("%ld\n", kbdStruct.vkCode);
        }
    }
}

当按下“左移”时输出为

160

当按下“搜索”按钮(笔记本上带有放大镜图标的按钮)时输出是

160
91
132

如何检查 HookCallback 中是否按下了“左移”或“搜索”按钮?

【问题讨论】:

    标签: c windows winapi


    【解决方案1】:

    160 是VK_LSHIFT,91 是VK_LWIN,132 是VK_F21。见Virtual-Key Codes。唯一标准化的搜索键是VK_BROWSER_SEARCH,因此很明显,您的键盘制造商正在为其搜索键使用非标准键。

    您需要根据需要记住从一个事件到下一个事件的键,例如:

    bool LeftShiftIsDown = false;
    bool LeftWinIsDown = false;
    bool F21IsDown = false;
    bool SearchIsDown = false;
    
    LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
    {
        if (nCode == HC_ACTION)
        {
            KBDLLHOOKSTRUCT *kbdStruct = (KBDLLHOOKSTRUCT*) lParam;
            if (wParam == WM_KEYDOWN)
            {
                printf("%ld is down\n", kbdStruct->vkCode);
                switch (kbdStruct->vkCode)
                {
                    case VK_LSHIFT:
                        LeftShiftIsDown = true;
                        break;
                case VK_LWIN:
                        LeftWinIsDown = true;
                        break;
                case VK_F21:
                        F21IsDown = true;
                        break;
                }
    
                if (LeftShiftIsDown && LeftWinIsDown && F21IsDown)
                {
                    if (!SearchIsDown)
                    {
                        SearchIsDown = true;
                        printf("Search is down\n");
                    }
                }
            }
            else if (wParam == WM_KEYUP)
            {
                printf("%ld is up\n", kbdStruct->vkCode);
                switch (kbdStruct->vkCode)
                {
                    case VK_LSHIFT:
                        LeftShiftIsDown = false;
                        break;
                    case VK_LWIN:
                        LeftWinIsDown = false;
                        break;
                    case VK_F21:
                        F21IsDown = false;
                        break;
                }
    
                if (!(LeftShiftIsDown && LeftWinIsDown && F21IsDown))
                {
                    if (SearchIsDown)
                    {
                        SearchIsDown = false;
                        printf("Search is up\n");
                    }
                }
            }
        }
        return CallNextHookEx(0, nCode, wParam, lParam);
    }
    

    【讨论】:

    • @RemyLebrau 谢谢。最后我抓住“VK_F21”并检查是否用GetKeyState函数按下了“VK_LSHIFT”和“VK_LWIN”
    猜你喜欢
    • 2021-12-12
    • 2023-04-03
    • 2013-07-11
    • 1970-01-01
    • 2016-11-03
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多