2016-02-26 165 views
1

我想在我的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; 
     } 
     } 
    } 
    } 
+0

@kfsone對不起,我編輯了我的問題 – calmandniceperson

回答

3

我怎麼能聽綁定到應用程序主窗口的系統熱鍵?

許多系統事件可以在主窗口本機事件處理程序中捕獲。原作者的帖子實際上綁定到主窗口。下面應處理請求的消息:

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

非常感謝!這實際上起作用,很容易理解,是非常直截了當的。 – calmandniceperson

4

無恥插頭:我已經寫了的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); 

就是這樣!希望它有幫助

+0

多開發一些Qt。好! – AlexanderVX

+0

我一直在尋找各種Qt熱鍵庫,從來沒有找到你的。到目前爲止,這是迄今爲止最好的記錄和易於獲取的庫。我會盡快嘗試。非常感謝你! – calmandniceperson

+0

@mkocs您的歡迎:D我剛剛創建了它,這可能是一個原因。 – Felix