【问题标题】:Global hotkey with WIN32 API?带有 WIN32 API 的全局热键?
【发布时间】:2010-12-21 16:56:55
【问题描述】:

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

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

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

【问题讨论】:

  • 我已经编写 Windows 应用程序近 20 年了,我不知道这个 API 调用存在 - 非常感谢,+1。 :)

标签: c++ winapi hwnd registerhotkey


【解决方案1】:

您的窗口是否可见并不重要。您不应该使用计划破坏的 hWnd(如对话框)。如果您没有其他合适的窗口,请创建一个单独的(不可见的)窗口。

【讨论】:

  • 我不销毁它我只是像这样隐藏它 ShowWindow(hwndDlg, SW_HIDE);
【解决方案2】:

我自己解决了,但感谢您的回复 这就是问题所在......

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

如果您先注册热键然后隐藏窗口...由于某种原因它会忽略热键...哦好吧..它现在可以工作了:)

【讨论】:

  • 酷。所以保证是全球性的?
【解决方案3】:

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

hWnd [输入,可选]

类型:HWND

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

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

【讨论】:

    【解决方案4】:

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

    #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
                 }
             }
    

    【讨论】:

      猜你喜欢
      • 2012-02-05
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 2011-03-15
      • 2011-05-28
      • 2023-03-03
      • 2021-05-17
      相关资源
      最近更新 更多