[笔记]Qt下使用SendMessage、PostMessage和接收window消息

1.头文件和库引用

首先必须要包含windows.h这个头文件,如果使用一些扩展函数,还需要包含windowsx.h。网上说使用FindWindow要添加头文件winuser.h,不过应该windows.h是自动包含这个依赖的(我没有添加)

复制代码
#include <windows.h>
#include <windowsx.h>

一定要在pro文件里添加:

复制代码
win32{ LIBS += -luser32 }

或在使用的cpp前添加

复制代码
#pragma comment  (lib, "User32.lib")

不引用库的话会报如下错误

2.FindWindow函数使用

复制代码
QString strClassName = "BodyCheckDlg";      //窗口的类名
QString strMainInterface = "主界面软件";        //窗口标题名
//HWND m_hMonitorHwnd = FindWindow(NULL,(LPCWSTR)strMainInterface.unicode());//查找窗口句柄
HWND m_hMonitorHwnd = FindWindow((LPCWSTR)strClassName ,(LPCWSTR)strMainInterface.unicode());//查找窗口句柄
WId m_hWnd = this->winId();                 //当前窗口的句柄

这里可以通过类名或窗口的标题名来获取窗口的句柄,避免出现重名的情况,也可以设置为NULL。

3.Qt发送消息和接收消息

这里发送消息还是使用SendMessage或PostMessage,接收消息就使用重写Qt的nativeEvent事件获取接收的系统消息

复制代码
//发送消息 SendMessage和PostMessage使用方法相同
::PostMessage(m_hMonitorHwnd, MONITOR_MESSAGE,(WPARAM)m_hWnd,1);
//这里MONITOR_MESSAGE为消息号,1为发送的数值,也可以使用COPYDATA方式发送

    if (NULL != m_hMonitorHwnd )
    {
        std::thread th([=](){ //单独启动一个线程进行数据传递
            QString command = QString("Command=ChangeCode=%1\r\n").arg(code);//传递的内容
            std::string param = command.toStdString();
            COPYDATASTRUCT data;    //使用COPYDATA的方式进行数据传递
            data.dwData = 0;
            data.cbData = param.length();
            data.lpData = &param[0];
            ::SendMessage(m_hMonitorHwnd , WM_COPYDATA, (WPARAM)m_hWnd, (LPARAM)&data);
        });
 
        th.detach();//传递结束后,进行关闭线程
    }

使用nativeEvent接收消息

头文件里声明nativeEvent

复制代码
protected:
    virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result);

函数实现:

复制代码
bool BodyCircularityDlg::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
    if(eventType == "windows_generic_MSG")
    {
		MSG* msg = reinterpret_cast<MSG*>(message); //
 
		if(msg->message == WM_COPYDATA)//消息类型
		{
			COPYDATASTRUCT *data = reinterpret_cast<COPYDATASTRUCT*>(msg->lParam);
			QTextCodec *gbk = QTextCodec::codecForName("GB18030");
			QString recevice = gbk->toUnicode((char *)(data->lpData));//转码
 
			if(recevice.contains("Command="))
			{
			   return true;//消息不再进行传递,不再处理
			}
 
			m_wnd = reinterpret_cast<HWND>(msg->wParam);//获取发送窗口的句柄
 
		}
    }
    return QWidget::nativeEvent(eventType, message, result);//交给Qt处理
}
相关推荐
-许平安-17 分钟前
MCP项目笔记七(插件 calculator)
c++·笔记·json·plugin·mcp
暗光之痕20 分钟前
Unreal5 研究笔记 蓝图自定义节点
笔记·unreal engine
210Brian40 分钟前
嘉立创EDA硬件设计与实战学习笔记(二):元件符号与封装的绘制
大数据·笔记·学习
oi..1 小时前
python Get/Post请求练习
开发语言·经验分享·笔记·python·程序人生·安全·网络安全
CSCN新手听安1 小时前
【Qt】Qt概述(三)Qt初识,HelloWorld的创建,对象树
开发语言·qt
努力学习的小廉1 小时前
redis学习笔记(九)—— Redis 持久化
redis·笔记·学习
busideyang2 小时前
函数指针类型定义笔记
c语言·笔记·stm32·单片机·算法·嵌入式
叶子野格3 小时前
Notepad++编写html文件使用D3绘图:数据可视化
笔记·学习·信息可视化·开源·notepad++
code_计梦星河3 小时前
Qt 开发第九天:时间控件 / 正则 / Vector / 主界面优化实操
qt
小温冲冲4 小时前
Qt WindowContainer 进阶指南:底层原理、性能优化与架构抉择
qt·性能优化·架构