Qt之进程间通信(Windows消息)
来源:互联网 发布:刚开淘宝店铺卖什么好 编辑:程序博客网 时间:2024/05/16 19:19
简述
通过上一节的了解,我们可以看出进程通信的方式很多,今天分享下如何利用Windows消息机制来进行不同进程间的通信。
- 简述
- 效果
- 发送消息
- 自定义类型与接收窗体
- 发送数据
- 接收消息
- 设置标题
- 重写nativeEvent
- 更多参考
效果
发送消息
自定义类型与接收窗体
包含所需库,定义发送的自定义类型、接收消息的窗体标题。自定义类型可以处理消息过多情况下,对消息的区分,如果不需要也可以去掉。
#ifdef Q_OS_WIN#pragma comment(lib, "user32.lib")#include <qt_windows.h>#endifconst ULONG_PTR CUSTOM_TYPE = 10000;const QString c_strTitle = "ReceiveMessage";
发送数据
点击按钮,进行消息发送。里面的do{…}while用来忽略本窗口,当然自身也可以接受自身的消息。
void onSendMessage(){ HWND hwnd = NULL; //do //{ LPWSTR path = (LPWSTR)c_strTitle.utf16(); //path = L"SendMessage" hwnd = ::FindWindowW(NULL, path); //} while (hwnd == (HWND)effectiveWinId()); // 忽略自己 if (::IsWindow(hwnd)) { QString filename = QStringLiteral("进程通信-Windows消息"); QByteArray data = filename.toUtf8(); COPYDATASTRUCT copydata; copydata.dwData = CUSTOM_TYPE; // 用户定义数据 copydata.lpData = data.data(); //数据大小 copydata.cbData = data.size(); // 指向数据的指针 HWND sender = (HWND)effectiveWinId(); ::SendMessage(hwnd, WM_COPYDATA, reinterpret_cast<WPARAM>(sender), reinterpret_cast<LPARAM>(©data)); }}
接收消息
设置标题
这一步很重要,必须与上一步的c_strTitle保持一致,否则会找不到窗体。自定义类型CUSTOM_TYPE也必须保持一致,进行过滤。
setWindowTitle("ReceiveMessage");
重写nativeEvent
bool nativeEvent(const QByteArray &eventType, void *message, long *result){ MSG *param = static_cast<MSG *>(message); switch (param->message) { case WM_COPYDATA: { COPYDATASTRUCT *cds = reinterpret_cast<COPYDATASTRUCT*>(param->lParam); if (cds->dwData == CUSTOM_TYPE) { QString strMessage = QString::fromUtf8(reinterpret_cast<char*>(cds->lpData), cds->cbData); QMessageBox::information(this, QStringLiteral("提示"), strMessage); *result = 1; return true; } } } return QWidget::nativeEvent(eventType, message, result);}
更多参考
- Qt之进程间通信(IPC)
- Qt之进程间通信(共享内存)
- Qt之进程间通信(QProcess)
- Qt之进程间通信(TCP/IP)
1 0
- 【Qt】Qt之进程间通信(Windows消息)【转】
- Qt之进程间通信(Windows消息)
- Qt之进程间通信(Windows消息)
- Qt 多进程通信之消息队列
- windows进程通信之消息和WM_COPYDATA
- Qt之进程间通信(IPC)
- Qt之进程间通信(QProcess)
- Qt之进程间通信(QProcess)
- Qt之进程间通信(IPC)
- 进程间通信之消息通信
- 进程间通信之消息队列通信
- 【Qt】Qt之进程间通信(IPC)【转】
- 【Qt】Qt之进程间通信(共享内存)【转】
- 【Qt】Qt之进程间通信(QProcess)【转】
- android 进程间通信之广播消息(Broadcast)
- Linux进程间通信之消息队列(一)
- Linux进程间通信之消息队列(二)
- 进程间通信方式之(五)消息队列
- MR-5.MapReduce分布式缓存(Distribute Cache)
- Swift传值传的是什么
- 如何解决C/C++中stack overflow问题
- MR-5.MapReduce排序
- java火车站售票系统之多线程并发访问
- Qt之进程间通信(Windows消息)
- MR-5.MapReduce常见Joins方法
- leetcode之Summary Ranges
- C++拷贝构造函数详解
- unix环境高级编程之信号篇(一)
- 用CMD命令快速安全的导入备份的SQL大文件
- 【ZYNQ-7000开发之十】TGP+VDMA+HDMI搭建视频通路
- SwipeRefreshLayout配合RecyclerView实现下拉刷新和上拉加载更多以及没有数据的显示
- openfire服务器无法开启问题解决