需求:

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

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. PAT(B) 1088 三人行(Java)

    题目链接:1088 三人行 (20 point(s)) 参考博客:PAT (Basic Level) Practice (中文)1088 三人行 (20 分)(Java实现)吃口雪花 题目描述 子曰: ...

  2. Python中turtle库的使用

    Turtle图形库 Turtle库是Python内置的图形化模块,属于标准库之一,位于Python安装目录的lib文件夹下,常用函数有以下几种: 画笔控制函数 penup():抬起画笔: pendow ...

  3. Oracle通过ODBC链接SqlServer数据库

    原网址:https://www.cnblogs.com/jijm123/p/11598515.html 第一步.创建ODBC数据源 这一步要考虑数据源是32位还是64位的问题,其实就是选择不同的exe ...

  4. 如何使用Cloud Foundry CLI把一个应用推送到MindSphere

    一.登录MindSphere - Cloud Foundry 1. 安装Cloud Foundry CLI (Command Line Interface). 下载地址:https://github. ...

  5. java-websocket客户端 断线重连 注入Service问题

    java版客户端: 使用开源项目java-websocket, github地址: https://github.com/TooTallNate/Java-WebSocket github上有很多示例 ...

  6. vs项目模板创建和使用

    一.使用dotnet命令创建(适用于.NET Core,可以创建包含任意数量个项目的模板,但不会出现在vs的新建项目模板中) 官方文档:https://docs.microsoft.com/zh-cn ...

  7. 3_PHP表达式_4_PHP运算符

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. 3.4.1 算术运算符 <?php $num1 = -10; $num2 = -4; $num3 = $nu ...

  8. iOS - 性能优化:Instruments使用简介

    最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...

  9. display的属性

    在一般的CSS布局制作时候,我们常常会用到display对应值有block.none.inline这三个值.,display这个属性用于定义建立布局时元素生成的显示框类型.对于 HTML 等文档类型, ...

  10. select加锁分析(Mysql)

    [原创]惊!史上最全的select加锁分析(Mysql) 前言 大家在面试中有没遇到面试官问你下面六句Sql的区别呢 select * from table where id = ? select * ...