QT5程序如何通过Win32 API向外部应用返回消息响应?
解决Qt5通过Win32 API向外部应用返回响应的问题
问题根源分析
你的代码存在几个关键问题导致无法正确返回响应:
- 重复注册窗口消息:每次进入
nativeEvent都调用RegisterWindowMessage,既低效也没必要。 - 错误的响应方式:调用
SendMessage给自己发消息不是返回响应的正确做法,反而可能引发消息循环。 - 消息处理逻辑错误:处理完自定义消息后,你调用了父类的
nativeEvent并返回false,导致你设置的*result值无法传递给消息发送方(SendMessage的返回值直接对应窗口过程处理后的result)。
修正方案
步骤1:优化窗口消息注册
在MainWindow类中添加成员变量存储注册好的消息ID,只在构造函数中初始化一次:
// MainWindow.h 中添加私有成员 private: UINT m_myMsg; UINT m_myMoveMsg;
步骤2:修正nativeEvent函数逻辑
移除错误的SendMessage调用,正确设置*result并返回true以终止消息传递:
#include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 仅初始化一次窗口消息ID m_myMsg = RegisterWindowMessage(L"MyMassage"); m_myMoveMsg = RegisterWindowMessage(L"MyMove"); } bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result) { MSG *msg = static_cast<MSG *>(message); // 处理MyMassage消息 if (m_myMsg == msg->message) { int wparam = msg->wParam; int lParam = msg->lParam; int wparamhi = wparam / 65536; int wparamlo = wparam - wparamhi * 65536; ui->log->append(QStringLiteral("таблица-%1 условие/действие-%2 номер-%3") .arg(wparamlo).arg(wparamhi).arg(lParam)); // 默认返回值设为0 *result = 0; if (wparamhi == 0) { // 处理条件请求 if (wparamlo == 1 && lParam == 1) { ui->log->append(QStringLiteral("Таблица 1,Условие 1")); *result = 1; // 设置要返回的响应值 } } else if (wparamhi == 1) { // 处理动作请求 if (wparamlo == 1 && lParam == 1) { ui->log->append(QStringLiteral("Таблица 1, Действие 1")); } *result = 1; // 设置响应值 } // 关键:返回true表示已处理该消息,*result的值会作为SendMessage的返回值传递给外部应用 return true; } // 处理MyMove消息 if (m_myMoveMsg == msg->message) { ui->log->append(QStringLiteral("move_move")); return true; } // 未处理的消息交给Qt默认逻辑处理 return QWidget::nativeEvent(eventType, message, result); }
核心原理说明
当外部应用通过SendMessage发送MyMassage时,该函数会阻塞直到你的窗口处理完消息。此时你设置的*result值会直接作为SendMessage的返回值被外部应用获取,这就是返回响应的正确方式。返回true是告诉Qt:这个消息我们已经处理完毕,不需要再向下传递。
内容的提问来源于stack exchange,提问作者Friedrich Wilhelm
相关产品推荐
相关产品推荐

