系统范围的热键快捷方式(Windows/Qt):防止窗口锁定

Sytem-wide Hotkey Shortcut(Windows/Qt) : Prevent window lock?

本文关键字:Qt 锁定 窗口 Windows 范围 快捷方式 系统      更新时间:2023-10-16

我正试图找到一种在Qt应用程序中使用系统范围热键的方法。要检查带有GetMessage的消息,您需要一个while()循环。这导致窗口锁定并被禁用,但每个热键的功能仍会被处理。

如何以允许ui响应的方式同时运行while循环?


示例

#define MOD_NOREPEAT    0x4000
#define MOD_ALT         0x0001
#include "stdafx.h"
#include <QDebug>
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    RegisterHotKey(NULL,1,MOD_ALT | MOD_NOREPEAT,0x42);
    RegisterHotKey(NULL,2,MOD_ALT | MOD_NOREPEAT,0x44);
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    MSG msg;
    while(GetMessage(&msg,NULL,0,0)){
        if (msg.message == WM_HOTKEY){
            if (msg.wParam == 1) qDebug() << "Hot Key activated : ALT + B";
            if (msg.wParam == 2) qDebug() << "Hot Key activated : ALT + D";
        }
    }
    return a.exec();
}

已解决!谢谢terenty。

简而言之,在允许ui完成加载之后,我将消息导入到自己的线程中。

#define MOD_NOREPEAT    0x4000
#define MOD_ALT         0x0001
#include "stdafx.h"
#include <QDebug>
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    RegisterHotKey(NULL,1,MOD_ALT | MOD_NOREPEAT,0x42);
    RegisterHotKey(NULL,2,MOD_ALT | MOD_NOREPEAT,0x44);
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    QApplication::processEvents();
    MSG msg;
    while(GetMessage(&msg,NULL,0,0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        if (msg.message == WM_HOTKEY){
            if (msg.wParam == 1) qDebug() << "Hot Key activated : ALT + B";
            if (msg.wParam == 2) qDebug() << "Hot Key activated : ALT + D";
        }
    }
    return msg.wParam;
}