WIN32 API的全球热键?

时间:2009-11-30 16:24:44

标签: c++ winapi hwnd registerhotkey

我已经能够像这样设置本地热键

 RegisterHotKey(hwndDlg, 100, MOD_ALT | MOD_CONTROL, 'S');

如何将热键设置为全局?即使我的窗户被隐藏,我也希望它能在那里。

4 个答案:

答案 0 :(得分:11)

我自己解决了,但谢谢你的回复 这是错的......

ShowWindow(hwndDlg, SW_HIDE);
RegisterHotKey(hwndDlg, 100, MOD_ALT | MOD_CONTROL, 'S');

如果你先注册热键,然后隐藏窗口......由于某种原因,它会忽略热键...哦......它现在正在工作:)

答案 1 :(得分:6)

http://msdn.microsoft.com/ru-RU/library/windows/desktop/ms646309(v=vs.85).aspx

  

hWnd [in,optional]

     

类型:HWND

     

< ...>如果此参数为NULL,则将WM_HOTKEY消息发布到   调用线程的消息队列,必须在中处理   消息循环。

这是注册全局热键的更好方法。

答案 2 :(得分:4)

窗口是否可见无关紧要。你不应该使用你计划销毁的hWnd(如对话框)。如果没有其他合适的窗口,请创建一个单独的(不可见)窗口。

答案 3 :(得分:2)

首先为热键定义一个或多个常量

#define HOTKEY1 1000
#define HOTKEY2 1002

然后注册这些热键

RegisterHotKey(NULL, HOTKEY1, MOD_ALT + MOD_SHIFT, 0x53); // ALT+SHIFT+s
RegisterHotKey(NULL, HOTKEY2, MOD_ALT + MOD_SHIFT, 0x51); // ALT+SHIFT+q

最后,在主要事件中,您会监视这些热键并对其进行响应:

         if (msg.message == HOTKEY1)
         {
             switch (LOWORD(msg.wParam))
             {
             case HOTKEY1:
                 // do such and such
                 break;
             case HOTKEY2:
                 // do such and such
                 break
             }
         }