Qt:Qt使用WM_COPYDATA消息进行进程通信
Qt使用WM_COPYDATA消息進行進程通信
如題,Qt使用WM_COPYDATA消息進行進程通信,這次我們使用windows相關api,來實現不同的 Qt窗口進程間的通信,使用的window的 WM_COPYDATA消息來實現。
實現效果
實現效果是 ,多個客戶端 窗口向服務端窗口發送消息,服務端接受到消息后 給客戶端一個回饋。效果截圖:
代碼解讀
Qt中截獲Windows消息,是使用qt提供的 nativeEvent函數,對著函數進行重載即可。我們是使用的WM_COPYDATA消息,傳遞的數據,是 下面這個數據結構。
typedef struct tagCOPYDATASTRUCT { // cds
DWORD dwData; //自定義數據
DWORD cbData; //指定lpData指向的數據的大小
PVOID lpData; //指向數據的指針
} COPYDATASTRUCT;
使用SendMessage發送消息,使用GetWindowThreadProcessId獲取進程ID,使用FindWindowW獲取目標窗口的句柄,但是這個函數在Qt中使用 并不是百試百靈,要點好幾下 才能找到!這個bug還沒找到原因!
博主是在window10環境,Qt 5.9.7版本上開發的。需要工程源代碼的同學,可以下載這里,或者github最新代碼進行下載。希望對同學們有所幫助。
下面是客戶端發送按鈕的槽函數:
下面是服務端的nativeEvent函數的代碼:
bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result) {MSG* msg = (MSG*)message;switch(msg->message){case WM_COPYDATA:qDebug() << "收到WM_COPYDATA客戶端消息";DWORD dwPid = 0;GetWindowThreadProcessId((HWND)msg->wParam,&dwPid);COPYDATASTRUCT *cds = reinterpret_cast<COPYDATASTRUCT*>(msg->lParam);QString text = QString("PID=[%1]的進程發來的消息為:%2").arg((int)dwPid).arg((char*)cds->lpData);ui->listWidget->addItem(text);//給客戶端回一個時間QTime time = QTime::currentTime();QString str = time.toString("hh:mm:ss");COPYDATASTRUCT cds2;cds2.dwData = 0;cds2.cbData = str.length() + 1;cds2.lpData = str.toUtf8().data();::SendMessage((HWND)msg->wParam, WM_COPYDATA, NULL, reinterpret_cast<LPARAM>(&cds2));return true;}//其他交給qt處理return QWidget::nativeEvent(eventType, message, result); }下面時候客戶端的nativeEvent函數
bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result) {MSG* msg = (MSG*)message;switch(msg->message){case WM_COPYDATA:qDebug() << "收到WM_COPYDATA服務端消息";COPYDATASTRUCT *cds = reinterpret_cast<COPYDATASTRUCT*>(msg->lParam);QString text = QString("服務端在[%1]接受到該消息").arg((char*)cds->lpData);ui->listWidget->addItem(text);return true;}//其他交給qt處理return QWidget::nativeEvent(eventType, message, result); }總結
以上是生活随笔為你收集整理的Qt:Qt使用WM_COPYDATA消息进行进程通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十八、数据容器、数据访问宽度、端口(计算
- 下一篇: 16.IDA-列出函数中存在的全部cal