码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2021-06-23 16:49:44      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:message   break   ssid   hwnd   itme   char   影响   sage   div   

        接到一个需求,如果焦点在程序内,则支持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软件无效,原因暂时不明。

        

        

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

标签:message   break   ssid   hwnd   itme   char   影响   sage   div   

原文地址:https://www.cnblogs.com/xuhuajie/p/14921253.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!