zoukankan      html  css  js  c++  java
  • 关于热键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软件无效,原因暂时不明。

            

            

  • 相关阅读:
    正则表达式大全
    List.FindAll查找实例
    list的ForEach跟FindAll
    利用C#实现数据同步功能
    数据集和数据库的同步-DataAdapter的使用
    OpenCV
    关于android toolchain
    每天一点Linux 进入终端模式
    源码下编译APK,却是总是提示,找不到符号:SystemProperties 。。。
    使用Android NDK中的独立toolchain来开发C/C++程序
  • 原文地址:https://www.cnblogs.com/xuhuajie/p/14921253.html
Copyright © 2011-2022 走看看