我如何收到消息(WM_COPYDATA)?

时间:2015-08-26 23:20:07

标签: delphi messages 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 

我在这里阅读(Delphi: What is Application.Handle?)在Don的回答中,发送到应用程序句柄的消息被重定向到主窗体,但在我的情况下它不会发生。 我怎样才能收到邮件? 为什么邮件不会重定向到主表单?

在Delphi XE8,Windows 10下进行测试

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:-3)

我找到了接收消息的解决方案: 我将主窗体的标题设置为等于Application.Title。所以现在FindWindow返回Main表单的句柄。 但现在我不能使用主要形式的动态字幕。