需求:

在动态库中创建一个窗口句柄,可以给外部调用,库的调用者,通过这个句柄发送消息到底层库,库里面可以实现对消息的处理

m_FHandle=AllocateHWnd(WndProcDllMsg);  // windows

1,动态库编写部分

.pro 工程文件

#-------------------------------------------------
#
# Project created by QtCreator --19T19::
#
#------------------------------------------------- QT += widgets QT -= gui TARGET = HandleMSG
TEMPLATE = lib DEFINES += HANDLEMSG_LIBRARY SOURCES += handlemsg.cpp HEADERS += handlemsg.h\
handlemsg_global.h unix {
target.path = /usr/lib
INSTALLS += target
}

头文件handlemag.h

#ifndef HANDLEMSG_H
#define HANDLEMSG_H #include "handlemsg_global.h"
#include <QWidget>
#include "windows.h" class HANDLEMSGSHARED_EXPORT HandleMSG: public QWidget
{ public:
HandleMSG(); int add(int a,int b);
bool nativeEvent(const QByteArray &eventType, void *message, long *result);
HWND getHWDN(); private:
int m_ia;
}; extern "C" Q_DECL_EXPORT int sub(int a, int b);//导出函数, 客户端可用 QLibrary 加载
extern "C" Q_DECL_EXPORT HandleMSG* getHandleMSG(); #endif // HANDLEMSG_H

handlemsg_gloab.h

#ifndef HANDLEMSG_GLOBAL_H
#define HANDLEMSG_GLOBAL_H #include <QtCore/qglobal.h> #if defined(HANDLEMSG_LIBRARY)
# define HANDLEMSGSHARED_EXPORT Q_DECL_EXPORT
#else
# define HANDLEMSGSHARED_EXPORT Q_DECL_IMPORT
#endif #endif // HANDLEMSG_GLOBAL_H

handlemsg.cpp

#include "handlemsg.h"

HandleMSG::HandleMSG()
{
m_ia = ;
} int HandleMSG::add(int a, int b)
{
return a + b + m_ia;
} int sub(int a, int b)
{
return a-b;
} HandleMSG *getHandleMSG()
{
return new HandleMSG();
} // 响应windows 消息,实现无边框窗体的消息处理
// 可参考https://jingyan.baidu.com/article/54b6b9c0e8a41f2d583b47eb.html
bool HandleMSG::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
if (eventType == "windows_generic_MSG")
{
// PostMessage((HWND)this->winId(), WM_USER + 777, 10, 20); 发送消息
PMSG msg = (PMSG)message;
if (msg->message == WM_USER + )
{
// BYTE nFunCode = LOBYTE(LOWORD(msg->wParam));
// BYTE nExecuteState = HIBYTE(LOWORD(msg->wParam));
m_ia++;
}
}
return false;
} HWND HandleMSG::getHWDN()
{
HWND handle = (HWND)this->winId();
return handle;
}

Used to define private messages for use by private window classes, usually of the form WM_USER+x, where x is an integer value.

#define WM_USER                         0x0400

2,动态库的使用

.pro文件

#-------------------------------------------------
#
# Project created by QtCreator --20T11::
#
#------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, ): QT += widgets TARGET = LoadDll
TEMPLATE = app SOURCES += main.cpp\
mainwindow.cpp HEADERS += mainwindow.h \
handlemsg.h \
handlemsg_global.h FORMS += mainwindow.ui LIBS += -L$$PWD HandleMSG.dll

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow> namespace Ui {
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = );
~MainWindow(); private:
Ui::MainWindow *ui;
}; #endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "handlemsg.h"
#include <QDebug>
#include <QPushButton>
#include <QLibrary> MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); typedef int (*Sub)(int a, int b);
typedef HandleMSG* (*GetHandleMSG)();//定义函数指针,获取类TestDLL对象;
QLibrary mylib("HandleMSG.dll"); if(!mylib.load()){// 加载 dll 失败
qDebug() <<"加载 HandleMSG.dll 失败!"<<endl;
} Sub sub = (Sub)mylib.resolve("sub");
if( == sub){// 加载失败
qDebug() <<"加载函数 add 失败!"<<endl;
}
int ss = sub(,); GetHandleMSG getHandleMSG = (GetHandleMSG)mylib.resolve("getHandleMSG");
if( == getHandleMSG){// 加载失败
qDebug()<<"加载函数 getHandleMSG 失败!"<<endl;
}
HandleMSG *pLib = getHandleMSG();
int sum = pLib->add(,); qDebug() << "from dll: " << sum << ss <<endl; connect(ui->pushButton,&QPushButton::clicked,this,[=]{
PostMessage(pLib->getHWDN(), WM_USER + , , ); //发送消息 SendMessage
// WINUSERAPI WINBOOL WINAPI PostMessageW (HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
});
connect(ui->pushButton,&QPushButton::clicked,ui->label,[=]{
ui->label->setText(QString::number(pLib->add(,)));
}); } MainWindow::~MainWindow()
{
delete ui;
}

关于qt动态库和静态库的参考文章https://www.cnblogs.com/woxinfeixiang2015/p/8334112.html

http://blog.sina.com.cn/s/blog_a6fb6cc90102vsdn.html

nativeEventFilter详解https://blog.csdn.net/luoshabugui/article/details/82428500

qt动态库实现无边框窗体的消息处理 nativeEvent的使用的更多相关文章

  1. Qt无边框窗体-最大化时支持拖拽还原

    目录 一.概述 二.效果展示 三.demo制作 1.设计窗体 2.双击放大 四.拖拽 五.相关文章 原文链接:Markdown模板 一.概述 用Qt进行开发界面时,既想要实现友好的用户交互又想界面漂亮 ...

  2. Qt无边框窗体-模拟模态窗体抖动效果

    目录 一.概述 二.效果展示 三.功能实现 四.相关文章 原文链接:Qt无边框窗体-模拟模态窗体抖动效果 一.概述 用Qt开发windows客户端界面确实是一大利器,兼顾性能的同时,速度相对来说也不错 ...

  3. Qt 无边框窗体改变大小 完美实现(全部自己实现)

    近期,做项目用到无边框窗体,令人蛋疼的是无边框窗体大小的改变要像右边框那样,上下左右四周,而且要流畅. 网上也找了些代码,发现居然还要连接到windows事件,这显然不合常理,后来自己新建了demo, ...

  4. Qt 无边框窗体改变大小 完美实现

    近期,做项目用到无边框窗体,令人蛋疼的是无边框窗体大小的改变要像右边框那样,上下左右四周,而且要流畅. 网上也找了些代码,发现居然还要连接到windows事件,这显然不合常理,后来自己新建了demo, ...

  5. Qt:移动无边框窗体(使用Windows的SendMessage)

    移动无边框窗体的代码网上很多,其原理都是一样的,但是是有问题的,我这里只是对其修正一下 网上的代码仅仅实现了两个事件 void EditDialog::mousePressEvent(QMouseEv ...

  6. 移动无边框窗体(设置标志位更流畅,或者发送WM_SYSCOMMAND和SC_MOVE + HTCAPTION消息)

    移动无边框窗体的代码网上很多,其原理都是一样的,但是是有问题的,我这里只是对其修正一下 网上的代码仅仅实现了两个事件 void EditDialog::mousePressEvent(QMouseEv ...

  7. C#WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置

    C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...

  8. C#自定义Winform无边框窗体

    C#自定义Winform无边框窗体 在实际项目中,WinForm窗体或者控件不能满足要求,所以就需要自己设计窗体等,当然设计界面可以用的东西很多,例如WPF.或者一些第三方的库等.本例中将采用WinF ...

  9. WinForm无边框窗体移动方法

    C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...

随机推荐

  1. 机器学习-EM算法笔记

    EM算法也称期望最大化(Expectation-Maximum,简称EM)算法,它是一个基础算法,是很多机器学习领域算法的基础,比如隐式马尔科夫算法(HMM), LDA主题模型的变分推断,混合高斯模型 ...

  2. Python2和3字符编码的区别

    Python2和3字符编码的区别 一.字符编码应用之Python 1.1 执行Python程序的三个阶段 Python test.py(我再强调一遍,执行test.py的第一步,一定是先将文件内容从硬 ...

  3. L2范数归一化概念和优势

    1 归一化处理        归一化是一种数理统计中常用的数据预处理手段,在机器学习中归一化通常将数据向量每个维度的数据映射到(0,1)或(-1,1)之间的区间或者将数据向量的某个范数映射为1,归一化 ...

  4. Golang高阶:Golang1.5到Golang1.12包管理

    Golang1.5到Golang1.12包管理 1. 前言 Golang 是一门到如今有十年的静态高级语言了,2009年的时候算是正式推出了,然后到最近的一两年,2017-2018年的时候,突然直线上 ...

  5. .net core使用CSRedisCore连接哨兵集群,并用作redis使用分布式缓存。

    CSRedisCore是国内大佬出品的一个Redis-Cli-SDK. Github地址:https://github.com/2881099/csredis 使用此插件作为分布式缓存也十分简单. 一 ...

  6. Extjs 兼容IE8常见问题及解决方法

    1. 在IE8中整个页面都打不开,一般情况是: 页面组件中最后一个属性出现了逗号 没有多余的逗号,就很有可能是组件中没有设置renderTo:Ext.getBody(); 2. 页面按钮颜色失效 自定 ...

  7. MNIST手写数据集在运行中出现问题解决方案

    今天在运行手写数据集的过程中,出现一个问题,代码没有问题,但是运行的时候一直报错,错误如下: urllib.error.URLError: <urlopen error [SSL: CERTIF ...

  8. Oracle查看占用表空间最大的表(排序)

    场景:在做数据库巡检时,检查大表是必不可少的操作,可以查看各表占用表空间的大小 代码: as sizes,q.num_rows,t.segment_type from dba_segments t l ...

  9. springboot系列(八)springboot整合mybatis

    本篇介绍一下在springboot中整合mybatis ,使用mysql数据库,集成durid 连接池技术,全部代码是手动生成,没有使用代码生成器来构建代码. 一.创建数据库和表 二.在pom中添加依 ...

  10. RMAN恢复数据文件

    实验之前先备份数据库 RMAN>backup database; 在操作系统中删除数据文件 5 SQL> startup ORACLE 例程已经启动. Total System Globa ...