两个程序的界面
发送消息和接受消息头文件
#include <Windows.h>
#include <WinUser.h>
const ULONG_PTR CUSTOM_TYPE = 10000;
const QString c_strTitle = “ReceiveMessage”; //这是接受程序的窗口标题如果不知道自己的设置可以通过软件spy++进行查找窗体信息
发送数据
void Widget::on_pushButton_clicked()
{
HWND hwnd = NULL;
LPWSTR path = (LPWSTR)c_strTitle.utf16(); //path = L"SendMessage"这里要用宽字符
hwnd = ::FindWindowW(NULL, path);
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<WPARAM>(sender), reinterpret_cast<LPARAM>(©data));
SendMessage中的参数请查看官方文档非固定写法
}
}
接受消息
setWindowTitle(“ReceiveMessage”); //这里的标题设置要和发送数据中的,c_strTitle保持一致;CUSTOM_TYPE 也要保持一致
//重写nativeEvent
bool Widget::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)
{
//在这里接受消息
QString strMessage = QString::fromUtf8(reinterpret_cast<char>(cds->lpData), cds->cbData);
QMessageBox::information(this, QStringLiteral(“提示”), strMessage);
*result = 1;
return true;
}
}
}
return QWidget::nativeEvent(eventType, message, result);
}