QT,通过WinAPI回复消息

问题描述 投票:0回答:1

我在 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;
}
c++ qt winapi qt5
1个回答
0
投票

msg->hwnd
是您的 Qt 应用程序的窗口,用于“接收”消息,而不是您可以向其发送响应消息的发送者窗口。 您分配给

*result

的值将作为

SendMessage()
的返回值返回给发送者(
PostMessage()
无法返回接收者的响应值)。
如果消息数据在 

msg->wParam

msg->lParam 中不携带

sender
的窗口作为参数,那么您根本无法知道将响应消息
direct
发送回哪个窗口。您必须通过 (Send|Post)Message(HWND_BROADCAST, ...) 将您的响应消息广播 到桌面上的每个顶级窗口。由于您使用的是
RegisterWindowMessage()
,因此只有理解您的消息的应用程序才能接收该广播。
    

© www.soinside.com 2019 - 2024. All rights reserved.