一、通信方式
通过windowAPI,SendMessage进行通信,等待结果返回,是一种同步的方式。PostMessage是将消息放入消息队列中,立即返回,是一种异步的方式。我采用的是同步的方式,两种方式用法一样。
二、发送方A程序
#pragma comment (lib,"User32.lib")
#pragma comment (lib,"Gdi32.lib")
#include <qt_windows.h>
#include <QTextCodec>
#include <future>
#include <Windows.h>
void MainWindow::on_pushButton_clicked()
{
//查找窗口句柄(L 将该字符串当做Unicode来编译)
HWND hWnd = FindWindow(NULL, L"王者荣耀");
if (hWnd != 0) {
qDebug()<<"\n窗口句柄:" << hWnd;
}
//WId wid = this->winId();
//qDebug()<<"本机hwnd"<<(HWND)wid;
m_wnd = hWnd;
if (NULL != m_wnd) {
QString command = QString("%1").arg(ui->lineEdit->text());
std::string param = command.toStdString();
COPYDATASTRUCT data; //使用COPYDATA的方式进行数据传递
data.dwData = 0; //指定传输的数据
data.cbData = param.length(); //指定数据大小
data.lpData = ¶m[0]; //指向要传递到接收应用程序的数据的指针。可以为空
SendMessage(m_wnd, WM_COPYDATA, 0, (LPARAM)&data);
}
}
三、接收方B程序
B程序,重写nativeEvent函数
bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
if (eventType == "windows_generic_MSG") //windows平台
{
MSG* msg = reinterpret_cast<MSG*>(message);
if (msg->message == WM_COPYDATA)
{
COPYDATASTRUCT *data = reinterpret_cast<COPYDATASTRUCT*>(msg->lParam);
QTextCodec *gbk = QTextCodec::codecForName("utf-8");
QString recevice = gbk->toUnicode((char *)(data->lpData));//转码
ui->label->setText(QString("系统收到消息:%1").arg(recevice));
return true;//消息不再进行传递,不再处理
}
}
return QWidget::nativeEvent(eventType, message, result);
}
四、效果图