Delphi 如何接收信息(WM_COPYDATA)?

Delphi 如何接收信息(WM_COPYDATA)?,delphi,messages,wm-copydata,Delphi,Messages,Wm Copydata,我正在向我的应用程序发送消息WM_COPYDATA,该应用程序有很多表单,但我无法接收。 一个表单的简单应用程序效果很好 我有这个代码的主要形式。没有收到任何消息 private procedure ReceiveMessage(var Msg: TWMCopyData); message WM_COPYDATA; ... procedure TForm1.ReceiveMessage; begin ShowMessage(PAnsiChar(Msg.CopyDataStruct.lpDa

我正在向我的应用程序发送消息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的回答中读到here(),发送到应用程序句柄的消息被重定向到主窗体,但在我的情况下,它不会发生。 我如何接收信息? 为什么邮件不重定向到主窗体


在Delphi XE8和Windows 10下测试时,我发现了接收消息的解决方案: 我将主窗体的标题设置为Application.Title。现在FindWindow返回主窗体的句柄。
但是现在我不能使用主窗体的动态标题。

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

如果表单具有动态标题,则可以找到如下句柄。设置标题“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;

所以你的问题是我们看不到的代码?这与使用空应用程序进行测试有什么不同?我的猜测是,应用程序中的其他内容“吞没”了您试图接收的消息。正如您自己所注意到的(但现在…),这是一个保证稍后会被破解的黑客程序。以正确的方式解决问题,请参阅其他答案。“…发送到应用程序句柄的消息被重定向到主窗体…”否。如何接收消息?:为该消息编写消息处理程序。为什么邮件不重定向到主窗体?:我们如何判断?您尚未显示消息是如何(或从何处)发送的。请为发送消息的小应用程序提供MCVE,也为不接收消息的小应用程序提供MCVE。Don的回答说消息将“视情况”转发到主窗体它实际上只是主窗体和应用程序窗口假装为单个窗口所需的少量消息。wm_CopyData消息不在其中。您可以签入Forms.pas以确认Don的断言。创建一个隐藏窗口(通过
AllocateHWnd
)和两侧的
registerwindwessage
(足够独特)。在发送方端,使用发送方隐藏窗口的句柄广播已注册的消息。当接收方接收到该消息时,他们会通过发布(因为最好避免同步
SendMessage(Timeout)
)将同一消息以自己的句柄发送到接收的发送方的窗口(并且可以选择存储发送方的句柄,以便彼此了解)。发送方接收它们的句柄并构建接收方集合。如果要使用TApplication.OnMessage事件接收消息,则需要在单独的类中处理它(键入TAppMessageHandler=class…OnMessage…,Application.OnMessage=MyMessageHandler.OnMessage;收到消息后,可以将其发送到Application.main表单