-1

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

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

在 Delphi XE8、Windows 10 下测试

4

2 回答 2

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;
于 2015-08-27T05:46:29.880 回答
-3

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

于 2015-08-26T23:39:58.940 回答