qt — C ++ Win32 Слушайте глобальные привязки клавиш

Я пытаюсь реализовать глобальные горячие клавиши в Windows в моем приложении C ++ / Qt. Я использовал 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;
}
}
}
}

1

Решение

Как прослушать горячую клавишу системы, привязанную к главному окну приложения?

Многие системные события могут быть перехвачены в собственном обработчике событий главного окна. И оригинальный авторский пост фактически привязывается к главному окну. Ниже следует обработать запрошенное сообщение:

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

Другие решения

Бесстыдный плагин: я написал библиотеку для 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);

И это все! Надеюсь, поможет

4

По вопросам рекламы [email protected]