Я пытаюсь реализовать глобальные горячие клавиши в 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;
}
}
}
}
Как прослушать горячую клавишу системы, привязанную к главному окну приложения?
Многие системные события могут быть перехвачены в собственном обработчике событий главного окна. И оригинальный авторский пост фактически привязывается к главному окну. Ниже следует обработать запрошенное сообщение:
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*/);
Бесстыдный плагин: я написал библиотеку для 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);
И это все! Надеюсь, поможет