[笔记]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处理
}
相关推荐
一只侯子3 小时前
Face AE Tuning
图像处理·笔记·学习·算法·计算机视觉
whale fall5 小时前
【剑雅14】笔记
笔记
友友马5 小时前
『QT』窗口 (一)
开发语言·数据库·qt
星空的资源小屋6 小时前
跨平台下载神器ArrowDL,一网打尽所有资源
javascript·笔记·django
Xudde.7 小时前
Quick2靶机渗透
笔记·学习·安全·web安全·php
AA陈超7 小时前
Git常用命令大全及使用指南
笔记·git·学习
愚戏师8 小时前
Python3 Socket 网络编程复习笔记
网络·笔记
降临-max9 小时前
JavaSE---网络编程
java·开发语言·网络·笔记·学习
大白的编程日记.10 小时前
【计算网络学习笔记】MySql的多版本控制MVCC和Read View
网络·笔记·学习·mysql
IMPYLH11 小时前
Lua 的 require 函数
java·开发语言·笔记·后端·junit·lua