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);
}