QT接收MFC的消息注意事项

48 篇文章 0 订阅

1.“Camera param setting” 代表的是Title名称

CWnd *pWnd = CWnd::FindWindow(NULL, _T("Camera param setting"));
	if (pWnd == NULL)
	{
		AfxMessageBox(_T("no find DataRecv"));
		return;
	}

2.与QT的Title对应

setWindowTitle("Camera param setting");

4.实现代码
MFC

void CICPWriteProcessDlg::OnSendMem()
{
	UpdateData();
	//查找进程
	//CWnd *pWnd = CWnd::FindWindow(NULL, _T("IPCReadProcess"));
	CWnd *pWnd = CWnd::FindWindow(NULL, _T("Camera param setting"));
	if (pWnd == NULL)
	{
		AfxMessageBox(_T("no find DataRecv"));
		return;
	}
	//获取进程号
	DWORD PID;
	GetWindowThreadProcessId(pWnd->m_hWnd, (DWORD*)&PID);
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);

	//分配虚拟内存
	LPVOID lpBaseAddress;
	lpBaseAddress = VirtualAllocEx(hProcess, 0, BUFFER_SIZE, MEM_COMMIT, PAGE_READWRITE);
	char data[BUFFER_SIZE];
	char* m_strMem = "1234556";
	strcpy_s(data, m_strMem);

	//把字符串写入hProcess进程的内存
	WriteProcessMemory(hProcess, lpBaseAddress, data, BUFFER_SIZE, NULL);

	//发送基址给目标进程
	pWnd->SendMessage(WM_nMemMsg, NULL, (LPARAM)lpBaseAddress);
	
	//等待接收程序接收数据
	Sleep(1000);
	//释放虚拟内存
	VirtualFreeEx(hProcess, lpBaseAddress, 0, MEM_RELEASE);
	AfxMessageBox(_T("1234556"));

}

5.QT

//接受Windows消息
bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
    MSG *param = static_cast<MSG *>(message);

    switch(param->message)
    {
        case WM_COPYDATA:
        {
             QMessageBox::information(this, QStringLiteral("提示"), strMessage);
            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);
                return true;
            }
        }
        case WM_nMemMsg:
        {
            qDebug() << QString(WM_nMemMsg);
            QString strMessage("123456789");

            QMessageBox::information(this, QStringLiteral("提示"), strMessage);
            LPVOID lpBaseAddress = (LPVOID)param->lParam;
            //把字符串写入hProcess进程的内存
            HANDLE hProcess = GetCurrentProcess();
            char data[BUFFER_SIZE];
            //从虚拟空间中读入数据
            ReadProcessMemory(hProcess, lpBaseAddress, data, BUFFER_SIZE, NULL);

            strMessage = QString::fromUtf8(data, BUFFER_SIZE);
            QMessageBox::information(this, QStringLiteral("提示"), strMessage);
            return true;
        }
    }

    return QWidget::nativeEvent(eventType, message, result);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值