我是靠谱客的博主 怕孤单魔镜,最近开发中收集的这篇文章主要介绍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:

#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:

#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 与外部exe进程间通信-基于操作系统的消息传递所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部