SetWindowsHookEx - VK_LSHIFT 和“搜索"之间的区别;键盘按钮 [英] SetWindowsHookEx - difference between VK_LSHIFT and "Search" keyboard button

查看:35
本文介绍了SetWindowsHookEx - VK_LSHIFT 和“搜索"之间的区别;键盘按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 SetWindowsHookEx 来捕捉键盘事件

I use SetWindowsHookEx to catch keyboard events

SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0)

这里是 HookCallback

Here is 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

当按下搜索"按钮(笔记本上带有放大镜图标的按钮)输出为

when press "search" button (button with loupe icon on notebooks) output is

160
91
132

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

How to check if "left shift" or "search" button is pressed inside HookCallback ?

推荐答案

160为VK_LSHIFT,91为VK_LWIN,132为VK_F21.请参阅虚拟密钥代码.唯一标准化的搜索键是 VK_BROWSER_SEARCH,因此很明显您的键盘制造商使用的是非标准键作为其搜索键.

160 is VK_LSHIFT, 91 is VK_LWIN, and 132 is VK_F21. See Virtual-Key Codes. The only standardized Search key is VK_BROWSER_SEARCH, so clearly your keyboard manufacturer is using a non-standard key for its Search key.

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

You need to remember the keys you see from one event to the next as needed, eg:

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);
}

这篇关于SetWindowsHookEx - VK_LSHIFT 和“搜索"之间的区别;键盘按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆