【问题标题】:How can I receive message (WM_COPYDATA)?如何接收消息(WM_COPYDATA)?
【发布时间】:2015-11-21 04:16:41
【问题描述】:

我正在向我的应用程序发送消息 WM_COPYDATA,该应用程序有很多表单,但我无法接收它。 一个表单的简单应用程序可以正常工作。

我有这个主要形式的代码。没有收到消息

private
 procedure ReceiveMessage(var Msg: TWMCopyData); message WM_COPYDATA;
...
procedure TForm1.ReceiveMessage;
begin
  ShowMessage(PAnsiChar(Msg.CopyDataStruct.lpData));
end;

我检查了应用程序和主窗体句柄。所以句柄看起来像:

Form1.Handle (main form) = 3348672
FindWindow result = Application.Handle = 7148290
FindWindowEx(Application.Handle,0,nil,nil) = 0 

我在 Don 的回答中读到这里(Delphi: What is Application.Handle?),发送到应用程序句柄的消息被重定向到主窗体,但在我的情况下它不会发生。 如何接收消息? 为什么消息没有重定向到主窗体?

在 Delphi XE8、Windows 10 下测试

【问题讨论】:

  • ".. 发送到应用程序句柄的消息被重定向到主窗体.." - 不。
  • 如何接收消息?:通过为该消息编写消息处理程序。 为什么消息没有重定向到主窗体?:我们怎么知道?您还没有显示消息是如何(或从何处)发送的。请为发送消息的小应用和不接收消息的小应用提供 MCVE。
  • Don 的回答是“酌情”将消息转发到主窗体。它实际上只是主窗体和应用程序窗口假装为单个窗口所必需的少数消息。 wm_CopyData 消息不在其中。您可以检查 Forms.pas 以确认 Don 的断言。
  • 在两边创建一个隐藏窗口(@98​​7654324@)和RegisterWindowMessage(足够独特)。在发送方使用发送方隐藏窗口的句柄广播注册的消息。当接收方收到该消息时,它们通过发布(因为最好避免同步SendMessage(Timeout))使用自己的句柄将相同的消息发送到接收的发件人的窗口来响应(并且可以选择存储发件人的句柄,以便他们彼此了解)。发送者接收他们的句柄并建立一个接收者的集合。
  • 如果您想使用 TApplication.OnMessage 事件接收消息,您需要在单独的类中处理它(类型 TAppMessageHandler = class... OnMessage...),Application.OnMessage = MyMessageHandler。消息;收到消息后,您可以将其发送到 Application.MainForm

标签: delphi messages wm-copydata


【解决方案1】:

除了您没有提供任何需要帮助的真实代码这一事实之外,您的问题可能是错误的。如果我假设正确,您可以发送消息,您可以接收它,但您将它发送到错误的地方。

如果你的表单有动态标题,你可以像这样找到它的句柄。设置标题“MyWindowTitle”的一些固定部分,并用这个函数找到它。

function FindFormHandle: HWND;
var
  NextHandle: HWND;
  NextTitle: array[0..260] of char;
begin
  Result:=0;
  NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);

  while NextHandle > 0 do
  begin
    GetWindowText(NextHandle, NextTitle, 255);

    if Pos('MyWindowTitle', NextTitle)>0 then
      Exit(NextHandle);

    NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);
  end;
end;

【讨论】:

    【解决方案2】:

    我找到了接收消息的解决方案: 我将主窗体的标题设置为 Application.Title。所以现在 FindWindow 返回主窗体的句柄。 但是现在我不能使用主窗体的动态标题了。

    【讨论】:

    • 所以您的问题出在我们看不到的代码中?这与使用空应用程序进行测试有什么不同?我的猜测是你的应用程序中的其他东西“吞下了”你试图接收的消息。
    • 正如您自己所指出的(但现在...),这是一个保证以后会破解的hack。以正确的方式解决它,看看其他答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2012-08-21
    相关资源
    最近更新 更多