Fork me on GitHub

关于热键HotKey与WM_KEYDOWN的一点心得

        接到一个需求,如果焦点在程序内,则支持VK_NEXT翻页。

        第一想法,是处理WM_KEYDOWN消息,发现是VK_NEXT则做相应的逻辑,但是程序内的界面太多了,每个界面都需要处理这个逻辑,显得不合适。

        热键可以解决这个问题。热键能保证只要用户操作了注册的热键,就能收到窗口消息WM_HOTKEY。

        热键的副作用就是会强占WM_KEYDOWN。

        什么意思,就是原先会产生WM_KEYDOWN的VK_NEXT,如果被注册热键了,那么只能收到WM_HOTKEY,WM_KEYDOWN收不到了。

        一种解决方法是,造一个WM_KEYDOWN,以避免影响其他程序。

        

 case WM_CREATE:
    {
        //注册热键
        g_hotkeyid = GlobalAddAtom(L"VK_LEFT") - 0xC000;
        RegisterHotKey(hWnd, g_hotkeyid, 0, VK_NEXT);
    }
        break;
    case WM_DESTROY:
    {
        //反注册热键
        UnregisterHotKey(hWnd, g_hotkeyid);
        PostQuitMessage(0);
    }
    break;
    case WM_HOTKEY:
    {
        HWND focusWnd = GetForegroundWindow();
        DWORD focusThreadId = GetWindowThreadProcessId(focusWnd, NULL);
        DWORD currentThreadId = GetCurrentThreadId();
        if (focusThreadId == currentThreadId)
        {
            Draw();
        }
        else
        {
            //吐出事件
           PostMessage(focusWnd, WM_KEYDOWN, VK_NEXT, 0x01510001);
           PostMessage(focusWnd, WM_CHAR, VK_NEXT, 0x01510001);
            
        }
    }

           实测对网页,visual studio等软件都运行良好。

           但是对office软件无效,原因暂时不明。

        

        

posted @ 2021-06-23 09:05  烟波--钓徒  阅读(706)  评论(0编辑  收藏  举报