qt动态库实现无边框窗体的消息处理 nativeEvent的使用
需求:
在动态库中创建一个窗口句柄,可以给外部调用,库的调用者,通过这个句柄发送消息到底层库,库里面可以实现对消息的处理
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的使用的更多相关文章
- Qt无边框窗体-最大化时支持拖拽还原
目录 一.概述 二.效果展示 三.demo制作 1.设计窗体 2.双击放大 四.拖拽 五.相关文章 原文链接:Markdown模板 一.概述 用Qt进行开发界面时,既想要实现友好的用户交互又想界面漂亮 ...
- Qt无边框窗体-模拟模态窗体抖动效果
目录 一.概述 二.效果展示 三.功能实现 四.相关文章 原文链接:Qt无边框窗体-模拟模态窗体抖动效果 一.概述 用Qt开发windows客户端界面确实是一大利器,兼顾性能的同时,速度相对来说也不错 ...
- Qt 无边框窗体改变大小 完美实现(全部自己实现)
近期,做项目用到无边框窗体,令人蛋疼的是无边框窗体大小的改变要像右边框那样,上下左右四周,而且要流畅. 网上也找了些代码,发现居然还要连接到windows事件,这显然不合常理,后来自己新建了demo, ...
- Qt 无边框窗体改变大小 完美实现
近期,做项目用到无边框窗体,令人蛋疼的是无边框窗体大小的改变要像右边框那样,上下左右四周,而且要流畅. 网上也找了些代码,发现居然还要连接到windows事件,这显然不合常理,后来自己新建了demo, ...
- Qt:移动无边框窗体(使用Windows的SendMessage)
移动无边框窗体的代码网上很多,其原理都是一样的,但是是有问题的,我这里只是对其修正一下 网上的代码仅仅实现了两个事件 void EditDialog::mousePressEvent(QMouseEv ...
- 移动无边框窗体(设置标志位更流畅,或者发送WM_SYSCOMMAND和SC_MOVE + HTCAPTION消息)
移动无边框窗体的代码网上很多,其原理都是一样的,但是是有问题的,我这里只是对其修正一下 网上的代码仅仅实现了两个事件 void EditDialog::mousePressEvent(QMouseEv ...
- C#WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置
C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...
- C#自定义Winform无边框窗体
C#自定义Winform无边框窗体 在实际项目中,WinForm窗体或者控件不能满足要求,所以就需要自己设计窗体等,当然设计界面可以用的东西很多,例如WPF.或者一些第三方的库等.本例中将采用WinF ...
- WinForm无边框窗体移动方法
C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...
随机推荐
- vim常用命令的使用
中文博客:https://www.cnblogs.com/lijia0511/p/5644566.html 英文原文:http://yannesposito.com/Scratch/en/blog/L ...
- AJAX一些注释掉的语句
var sysdept=JSON.parse(localStorage.getItem("loginSysUser")); for(var o in sysdept){ alert ...
- PB计算两个日期相差月份(计算工龄)
ll_intime_y = year(date(this.object.in_factory_day[row])) ll_intime_m = month(date(this.object.in_fa ...
- PB笔记之导入、导出组件
导入组件 导出组件
- Vue使用指南(三)
组件 '''1.根组件:new Vue()创建的组件,一般不明确自身的模板,模板就采用挂载点2.局部组件: local_component = {}2.全局组件: Vue.component({})' ...
- 最简容器动手小实践——FC坦克大战游戏容器化
FC 经典力作相信大家一点也不陌生.童年时期最频繁的操作莫过于跳关,在 果断跳到最后一关之后,一般都是以惨败告终,所以还是一关一关的过原始积累才能笑到最后.这款游戏的经典就在于双人配合,守家吃装备.也 ...
- php-获取某个文件夹下面的文件数量
/** * 获取文件夹下文件的数量 * @param $url 传入一个url如:/apps/web * @return int 返回文件数量 */ public function getFileNu ...
- sql For xml path('') 备忘
sql 合并行使用的两个函数记录: SELECT CityName,STUFF((SELECT ',' + UserName FROM table1 subTitle WHERE CityName=A ...
- js-Array数组
一.创建数组的两种方式 1.使用Array构造函数 var colors = new Array(); var colors = new Array(20); var colors = new Arr ...
- c# dynamic实现动态实体,不用定义实体就能序列化为标准json
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...