C++ Win32 侦听全局键绑定

C++ Win32 Listen for global keybinds

本文关键字:绑定 全局 Win32 C++      更新时间:2023-10-16

我正在尝试在我的C++/Qt应用程序中实现Windows上的全局热键。我使用了 RegisterHotKey,它出人意料地有效,我可以看到按下组合会触发我的事件,但由于我不知道任何其他方式,我只使用了一个循环,它现在阻止了我的窗口并阻止它出现。

你可以在下面找到我的代码。如何收听此组合?当然必须有另一种方式。

void set_win32_keys(MainWindow *mwin) {
    HWND main_hwnd = (HWND)mwin->winId();
    RegisterHotKey(main_hwnd, 2, MOD_CONTROL | MOD_SHIFT, 0x32 /*2 key*/);
    MSG *msg;
    msg = new MSG();
    BOOL b_ret;
    while ((b_ret = GetMessage(msg, main_hwnd, 0, 0)) != 0) {
      if (b_ret == -1) {
        qDebug() << "Error";
      } else {
        if (msg->message == WM_HOTKEY) {
          mwin->new_screenshot();
          qDebug() << msg;
        }
      }
    }
  }

无耻的插件:我为Qt编写了一个库,它以跨平台的方式提供全局热键 - 并允许使用例如QKeySequence来创建热键。它允许您使用QKeySequenceEdit让用户输入自己的快捷方式:

https://github.com/Skycoder42/QHotkey

例:

//MainWindow constructor:
QHotkey *hotkey = new QHotkey(Qt::Key_2, Qt::ControlModifier | Qt::ShiftModifier, true, this);
connect(hotkey, &QHotkey::activated, this, &MainWindow::new_screenshot);

就是这样!希望对你有帮助

如何收听绑定到应用程序主窗口的系统热键?

许多系统事件可以在主窗口本机事件处理程序中捕获。原作者帖子实际上绑定到主窗口。下面应处理请求的消息:

class MainWindow : public QMainWindow
{
      // ... snip ...
      bool nativeEvent(const QByteArray& eventType, void* message, long* result) override;
      // ... snip ...
};
bool MainWindow::nativeEvent(const QByteArray& eventType, void* message, long* result)
{
    MSG* pMsg = reinterpret_cast<MSG*>(message);
    if (pMsg->message == WM_HOTKEY)
    {
       // process pMsg->wParam / lParam etc.
       // the intended action
       this->new_screenshot();
    }
    // call the parent, could be QWidget::nativeEvent
    return QMainWidow::nativeEvent(eventType, message, result);
}

因为假设mwinQMainWindow*

HWND main_hwnd = (HWND)mwin->winId();
RegisterHotKey(main_hwnd, 2, MOD_CONTROL | MOD_SHIFT, 0x32 /*2 key*/);