C++ Win32 监听全局键绑定

Posted

技术标签:

【中文标题】C++ Win32 监听全局键绑定【英文标题】:C++ Win32 Listen for global keybinds 【发布时间】:2016-06-10 04:17:03 【问题描述】:

我正在尝试在我的 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;
        
      
    
  

【问题讨论】:

@kfsone 对不起,我编辑了我的问题 【参考方案1】:

无耻插件:我为 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);

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

【讨论】:

进一步开发 Qt。好! 我一直在搜索各种 Qt 的热键库,但从未找到你的。这是迄今为止最好的文档和易于获取的库。我会尽快尝试。非常感谢您! @mkocs 欢迎您:D 我最近才创建它,这可能是一个原因。 @Felix 我昨天试过了,效果很好。那个图书馆做得很好:)【参考方案2】:

如何监听应用主窗口绑定的系统热键?

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

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*/);

【讨论】:

非常感谢!这确实有效,非常容易理解,非常简单。

以上是关于C++ Win32 监听全局键绑定的主要内容,如果未能解决你的问题,请参考以下文章

在 Emacs 中全局覆盖键绑定

Vue中全局事件的解绑

访问冲突将元素插入全局地图[重复]

如何在 Win32 中定位进程的全局和堆栈区域?

Win32API全局窗口类的注册与创建

Win32 中的全局(进程范围)属性