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;
}
}