您的当前位置:首页正文

Qt处理windows系统消息实现全局热键

2024-11-11 来源:个人技术集锦

QT5中处理windows系统消息QAbstractNativeEventFilter

NativeEventFilter,本地事件过滤器,在Qt中,当需要对系统消息或者自定义消息进行处理时会用到。相关的有QAbstractNativeEventFilter类和两个函数(installNativeEventFilter、removeNativeEventFilter)

一 QAbstractNativeEventFilter

virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) = 0

实际中一般是在QApplication层面对系统消息进行处理。有两种方式:

1、从QApplication派生出一个类,并且继承QAbstractNativeEventFilter,实现nativeEventFilter接口

demo:

class MyApp : public QApplication , public QAbstractNativeEventFilter 
{....};

2、单写一个QAbstractNativeEventFilter一个子类,然后在QApplication安装该过滤器即可,涉及QApplication的两个函数:

void installNativeEventFilter(QAbstractNativeEventFilter *filterObj)
void removeNativeEventFilter(QAbstractNativeEventFilter *filterObject)

demo:

#include <QApplication>
#include <QAbstractNativeEventFilter>
 
class MyAppNativeEventFilter  : public QAbstractNativeEventFilter 
{
    virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override;
};
 
int main(int argc,   char* argv [])
{
    QApplication app(argc, argv);
    MyAppNativeEventFilter filter;
    app.installNativeEventFilter(&filter);
    return app.run();
}

二 nativeEventFilter接口实现

Qt assistant上有一些事例。

例如windows上

virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *) override
{
    if(eventType == "windows_generic_MSG" || eventType == "windows_dispatcher_MSG")
    {
        MSG* pMsg = reinterpret_cast<MSG*>(message);
        if(pMsg->message == WM_COPYDATA)
        {
            qDebug()<<"demo";
        }
    }
    return false; // 注意返回值  如果要过滤掉消息,即停止进一步处理消息,则返回true;否则,返回true。 否则返回false。
};

 

 

 

处理热键消息

class CMainWindow : public QMainWindow, public QAbstractNativeEventFilter
{
    bool nativeEventFilter(const QByteArray &eventType, void *message, long *)
    {
        MSG* pMsg = reinterpret_cast<MSG*>(message);

    	if (pMsg->message == WM_HOTKEY && pMsg->wParam == DN_HOT_KEY_ID)
	    {
		    TerminateProcess((HWND)-1, 0);
		    return true;
	    }

	    return false;
    }
}

 

Top