我是靠谱客的博主 怕孤单魔镜,这篇文章主要介绍Qt 与外部exe进程间通信-基于操作系统的消息传递,现在分享给大家,希望可以做个参考。

步骤:

进程A 通过WindowAPI找到需要传递信息的窗口。

然后通过windowAPI发送自定义的消息(其实本质上还是window操作系统定义的消息结构,只不过其中有个字段的值被设置成了自己特有的值:const ULONG_PTR CUSTOM_TYPE_SEND_WEBVIEWER = 10007;)这样在发送带有需要传递的信息。

进程B通过Qt已经实现的 nativeEvent()函数来捕获window系统发送过来的消息。

然后通过对消息的筛选(即之前自定义消息中的特定字段的值的判断ULONG_PTR CUSTOM_TYPE_SEND_WEBVIEWER = 10007来确实是否是自己想要的信息),获取到想要信息后,就直接对信息处理,完成想要的功能。

进程A:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#ifdef Q_OS_WIN #pragma comment(lib, "user32.lib") #include <qt_windows.h> #include "windows.h" #endif const ULONG_PTR CUSTOM_TYPE_SEND_WEBVIEWER = 10007; // char strId[256]; q2s(qstrId).copy(strId , qstrId.size(),0); strId[qstrId.size()]= ''; //调用window.h种的api来寻找标题为“RKWebViewModel”的窗口。 HWND hwnd = NULL ; QString qstrReceiveName =QString::fromLocal8Bit("RKWebViewModel"); LPWSTR path = (LPWSTR)qstrReceiveName.utf16(); hwnd = ::FindWindowW(NULL ,path); //判断找到的句柄是否为窗口,如果是就通过window的消息COPYDATASTRUCT结构体来实现信息与数据的封装 if (::IsWindow(hwnd)) { COPYDATASTRUCT copydata ; memset(&copydata , 0 ,sizeof(COPYDATASTRUCT)); copydata.dwData = CUSTOM_TYPE_SEND_WEBVIEWER; // 用户定义数据 copydata.lpData = strId ; // 指向数据的指针 copydata.cbData = qstrId.size(); //数据大小 //winApi发送信息(通过操作系统的消息传递机制) ::SendMessage(hwnd, WM_COPYDATA, reinterpret_cast<WPARAM>((HWND)(this->winId())), reinterpret_cast<LPARAM>(&copydata)); //ProMessageHandleC::sendMessageByCameraInfo((HWND)(this->winId()), c_strTitle, pszData, sizeof(stuDeviceInfo)); }

 

进程B:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#ifdef Q_OS_WIN #pragma comment(lib, "user32.lib") #include <qt_windows.h> #endif const ULONG_PTR CUSTOM_TYPE_SEND_WEBVIEWER = 10007; //bool winEvent(MSG * message, long * result) 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_SEND_WEBVIEWER) { char strId[256]; memcpy(strId, reinterpret_cast<char*>(cds->lpData),cds->cbData); qDebug() << strId <<endl; if (!QString(strId).isEmpty()) { m_pWebEngineView->setFloodId(QString(strId)); } return true; } } } return QWidget::nativeEvent(eventType, message, result); //return QWidget::winEvent(message, result); }

 

最后

以上就是怕孤单魔镜最近收集整理的关于Qt 与外部exe进程间通信-基于操作系统的消息传递的全部内容,更多相关Qt内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部