我在 qt5 上编写了一些图形应用程序,我需要它能够通过 WinAPI 从外部应用程序接收、处理和发送消息。我能够实现一个函数来接收请求,但是向消息来源的应用程序发送响应时存在一些问题(我想发送变量“结果”),请告诉我,我如何修改这个函数,以便它发回我在变量“结果”中设置的一些数据。 PS外部应用程序发送名为“MyMassage”的请求。尝试了各种功能“SendMessage”,“PostMessage”(有些现在已注释),但我没有得到想要的结果。
#include "mainwindow.h"
bool MainWindow::nativeEvent(const QByteArray &eventType, void *message,
long *result) {
UINT msg1 = RegisterWindowMessage(L"MyMassage");
UINT msg2 = RegisterWindowMessage(L"MyMove");
MSG *msg = static_cast<MSG *>(message);
int i = 0, wparamhi, wparamlo, wparam, lParam;
if (msg1 == msg->message) {
wparam = msg->wParam;
lParam = msg->lParam;
wparamhi = wparam / 65536;
wparamlo = wparam - wparamhi * 65536;
ui->log->append("таблица-" + QString::number(wparamlo) +
" условие/действие-" + QString::number(wparamhi) +
" номер-" + QString::number(lParam));
*result = 0;
if (wparamhi == 0) // условие
{
if (wparamlo == 1) // таблица 1
{
if (lParam == 1) {
ui->log->append("Таблица 1,Условие 1");
*result = 1; // вернуть условие 1 = TRUE
// SendMessage(msg->hwnd, msg1, 1, 1);
}
}
// UINT responseMsg = RegisterWindowMessage(L"MyResponse");
// PostMessage(msg->hwnd,msg1, *result, 0);
}
if (wparamhi == 1) {
if (wparamlo == 1) // таблица 1
{
if (lParam == 1) {
ui->log->append("Таблица 1, Действие 1");
}
}
*result = 1;
// SendMessage(msg->hwnd, msg1, 0, 0);
}
// PostMessage(msg->hwnd, WM_USER+1, 1, 1);
SendMessage(msg->hwnd, msg1, 0, 0);
}
if (msg2 == msg->message) {
ui->log->append("move_move");
}
return QWidget::nativeEvent(eventType, message, result);
return false;
}
msg->hwnd
是您的 Qt 应用程序的窗口,用于“接收”消息,而不是您可以向其发送响应消息的发送者窗口。
您分配给*result
的值将作为
SendMessage()
的返回值返回给发送者(PostMessage()
无法返回接收者的响应值)。如果消息数据在 msg->wParam
或 msg->lParam
中不携带
sender的窗口作为参数,那么您根本无法知道将响应消息
direct发送回哪个窗口。您必须通过
(Send|Post)Message(HWND_BROADCAST, ...)
将您的响应消息广播 到桌面上的每个顶级窗口。由于您使用的是 RegisterWindowMessage()
,因此只有理解您的消息的应用程序才能接收该广播。