Qt5_自定义处理Windows消息函数

ZC:(1)、“#include <QAbstractNativeEventFilter>”,(2)、貌似 返回True(意思是 处理过了) 返回False(意思是还需要继续处理)

 

1、参考网址:(ZC: 自定义Windows消息处理)

http://bbs.csdn.net/topics/391054195

http://blog.csdn.net/zhangjinqing1234/article/details/49903613

 

2、关键字:

类QAbstractNativeEventFilter,虚函数nativeEventFilter

 

3、两种方式:

  3.1、窗口类 直接继承 类QAbstractNativeEventFilter,实现 虚函数nativeEventFilter

  ZC: 该方式 我没有测试

复制代码
class MainWindow : public QMainWindow, public QAbstractNativeEventFilter
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *) Q_DECL_OVERRIDE
    {
        //...
        return false;
    };

private:
    Ui::MainWindow *ui;
};
复制代码

   ZC:(20180512)尝试下来,是可以的,但是 在 main(...)函数中还是要安装 事件过滤器,如下:

复制代码
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    // 没有这一句的话,不会进行 事件过滤
    a.installNativeEventFilter(&w);// 注意,不是“a.installEventFilter(w);”,少了 "Native"

    return a.exec();
}
复制代码

 

 

 

  3.2、自定义类 继承类QAbstractNativeEventFilter,实现 虚函数nativeEventFilter,并 installNativeEventFilter

  ZC: 该方式 我测试过,是OK的,内容记录下来:

    3.2.1、自定义类 继承类QAbstractNativeEventFilter,实现 虚函数nativeEventFilter

      classNativeEventFilterZ.h : 

复制代码
#ifndef CLASSNATIVEEVENTFILTERZ_H
#define CLASSNATIVEEVENTFILTERZ_H

#include <QDebug>
#include <qabstractnativeeventfilter.h>

#include <windows.h>
#pragma comment(lib, "user32.lib")

#define WM_WinCreate WM_USER+1000

class NativeEventFilterZ : public QAbstractNativeEventFilter
{
    //Q_OBJECT // ZC: 这个不需要...
public:
    virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) Q_DECL_OVERRIDE
    {
        MSG* pMsg = reinterpret_cast<MSG*>(message);
        //if(pMsg->message == WM_COPYDATA)
        //{
        //    qDebug()<<"MainWindow windows system message WM_COPYDATA";
        //}
        //qDebug() << "pMsg->message : " << pMsg->message;
        if(pMsg->message == WM_WinCreate)
        {
            void* p = NULL;
            qDebug() << "WM_WinCreate";
            return true;
        }
        return false;
    }
};

#endif // CLASSNATIVEEVENTFILTERZ_H
复制代码

    3.2.2、installNativeEventFilter :

      main.cpp : 

复制代码
#include "mainwindow.h"
#include <QApplication>

#include "classNativeEventFilterZ.h"
#include <QDebug>

#include <Windows.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    qDebug() << "MainWindow.winId : " << w.winId() << " , " << GetCurrentThreadId();

    NativeEventFilterZ nativeEventFilterZ;
    a.installNativeEventFilter(&nativeEventFilterZ); // ZC: 这里,注意该函数中有"Native"
    return a.exec();
}
复制代码

 

4、

5、

 

posted @   CppSkill  阅读(7090)  评论(0)    收藏  举报
编辑推荐:
· 深入理解 C# 异步编程:同步、Task.Wait () 与 await 的本质区别
· WPF 引用 ASP.NET Core 的 AOT 版本
· 通过 Canvas 将后端发来的一帧帧图片渲染成“视频”的实现过程
· 当加密ID需要变成Guid:为什么我选择了AES-CBC而非GCM?
· 基于 epoll 的协程调度器——零基础深入浅出 C++20 协程
阅读排行:
· .NET周刊【8月第1期 2025-08-03】
· Manus快速搭建个人网站
· 这套 Java 监控系统太香了!我连夜给项目加上了
· 【译】GPT-5 现已在 Visual Studio 中可用
· 千亿消息“过眼云烟”?Kafka把硬盘当内存用的性能魔法,全靠这一手!
点击右上角即可分享
微信分享提示