2013-11-22 70 views
2

我试图找到一种方法,我可以在我的Qt应用程序中使用全系统热键。要检查GetMessage的消息,您需要一个while()循环。这会导致窗口锁定并被禁用,但是仍然会为每个热键处理功能。系统热键快捷键(Windows/Qt):防止窗口锁定?

如何以同时运行while循环的方式允许我的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(); 
    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(); 
} 

回答

2

解决了!谢谢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; 
} 
+0

甜,非常感谢这篇文章。我第一次使用qt和windows应用程序,所有这一切都是一个很好的时间。 – dtc