C++ Win32监听全局keybind
我想在我的C++/Qt应用程序的Windows上实现全局热键。我使用了RegisterHotKey,令人惊讶的工作,我可以看到,按组合触发我的事件,但因为我不知道任何其他方式,我只是用一个循环,现在阻止我的窗户,并阻止它显示出来。C++ Win32监听全局keybind
你可以在下面找到我的代码。我如何倾听这种组合?肯定有另一种方式。
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;
}
}
}
}
我怎么能听绑定到应用程序主窗口的系统热键?
许多系统事件可以在主窗口本机事件处理程序中捕获。原作者的帖子实际上绑定到主窗口。下面应处理请求的消息:
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);
}
因为假设mwin
有QMainWindow*
:
HWND main_hwnd = (HWND)mwin->winId();
RegisterHotKey(main_hwnd, 2, MOD_CONTROL | MOD_SHIFT, 0x32 /*2 key*/);
非常感谢!这实际上起作用,很容易理解,是非常直截了当的。 – calmandniceperson
无耻插头:我已经写了的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。好! – AlexanderVX
我一直在寻找各种Qt热键库,从来没有找到你的。到目前为止,这是迄今为止最好的记录和易于获取的库。我会尽快尝试。非常感谢你! – calmandniceperson
@mkocs您的欢迎:D我刚刚创建了它,这可能是一个原因。 – Felix
@kfsone对不起,我编辑了我的问题 – calmandniceperson