如何接收消息 (WM_COPYDATA)?

How can I receive message (WM_COPYDATA)?

我正在向我的应用程序发送消息 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

下测试

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

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

如果您的表单有动态标题,您可以像这样找到它的句柄。设置标题的固定部分"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;