知方号

知方号

Qt之进程间通信(Windows消息)

Qt之进程间通信(Windows消息)

简述

通过上一节的了解,我们可以看出进程通信的方式很多,今天分享下如何利用Windows消息机制来进行不同进程间的通信。

简述效果发送消息自定义类型与接收窗体发送数据接收消息设置标题重写nativeEvent

效果

发送消息自定义类型与接收窗体

包含所需库,定义发送的自定义类型、接收消息的窗体标题。自定义类型可以处理消息过多情况下,对消息的区分,如果不需要也可以去掉。

#ifdef Q_OS_WIN#pragma comment(lib, "user32.lib")#include #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(sender), reinterpret_cast(©data)); }}接收消息设置标题

这一步很重要,必须与上一步的c_strTitle保持一致,否则会找不到窗体。自定义类型CUSTOM_TYPE也必须保持一致,进行过滤。

setWindowTitle("ReceiveMessage");重写nativeEventbool nativeEvent(const QByteArray &eventType, void *message, long *result){ MSG *param = static_cast(message); switch (param->message) { case WM_COPYDATA: { COPYDATASTRUCT *cds = reinterpret_cast(param->lParam); if (cds->dwData == CUSTOM_TYPE) { QString strMessage = QString::fromUtf8(reinterpret_cast(cds->lpData), cds->cbData); QMessageBox::information(this, QStringLiteral("提示"), strMessage); *result = 1; return true; } } } return QWidget::nativeEvent(eventType, message, result);}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。