需求:

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

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. FFmpeg中AVFrame.linesize的含义

    在第一节FFmpeg开发教程一.FFmpeg 版 Hello world中遇到一个问题,在保存YUV的时候,粗暴的使用: fwrite(buf, 1, xsize * ysize, f); 方式去拷贝 ...

  2. ALV报表——选择屏幕选项卡

    ALV选择屏幕选项卡 运行效果: 代码: *&--------------------------------------------------------------------* *&a ...

  3. ReflectionTest:由输入的类名得到类的信息

    package reflection; import java.lang.reflect.*; import java.util.*; public class ReflectionTest { pu ...

  4. FFMPEG - ffplay源代码分析

    FFmpeg是一个开源,免费,跨平台的视频和音频流方案,它提供了一套完整的录制.转换以及流化音视频的解决方案.而ffplay是有ffmpeg官方提供的一个基于ffmpeg的简单播放器.学习ffplay ...

  5. linux之rename和mv的区别

    rename 命令格式 rename [ -v ] [ -n ] [ -f ] perlexpr [ files ] 参数介绍 -v:被替换掉的字符串 -n:替换成的字符串 -f:匹配要替换的文件模式 ...

  6. 升级win10 1903版后,vmware打开虚拟机黑屏的解决办法

    按照网上给的方法(1-3),又增加了几步(从4开始,只在我自己电脑上实践过): 1. 打开cmd,执行以下命令 netsh winsock reset 2. 重启电脑 3. 以管理员身份执行vmwar ...

  7. [转]github 上传project代码

    原文地址:https://www.cnblogs.com/f1194361820/p/4741558.html 1)将远程仓库纳入管理 其实就是添加远程仓库,在你已有的本地仓库目录下执行如下命令: $ ...

  8. 微信小程序 之wxml保留小数点后两位数的方法及转化为字符串的方法

    原理:wxml中不能直接使用较高级的js语法,如‘.toFixed’,‘toString()’,但可以通过引入wxs模块实现效果 1.新建`filter.wxs` var filters = {    ...

  9. IO五种模型和select与epoll工作原理(引入nginx)

    用户速度体验的1-3-10原则 性能影响 有很多研究都表明,性能对用户的行为有很大的影响: 79%的用户表示不太可能再次打开一个缓慢的网站 47%的用户期望网页能在2秒钟以内加载 40%的用户 ...

  10. Python_continue_break语句

    1.continue,break语句: userArray=['张三','李四','王五','老六'] for name in userArray: if(name=='王五'): continue ...