我用qt5编写了一个图形应用程序。我需要它能够通过 Win32 API 从外部应用程序接收和处理。我能够实现一个接收请求的函数,但是向消息来源的应用程序发送响应时存在一些问题(我想发送变量
result
)。
如何修改此函数,以便它发回我在变量
result
中设置的一些数据?
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()
,因此只有理解您的消息的应用程序才能接收该广播。