代码之家  ›  专栏  ›  技术社区  ›  user1596704

如何接收消息(WM_COPYDATA)?

  •  -1
  • user1596704  · 技术社区  · 9 年前

    我正在向我的应用程序发送消息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 回复  |  直到 7 年前
        1
  •  1
  •   smooty86    9 年前

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

    如果表单具有动态标题,则可以找到这样的句柄。设置标题“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
  •  -3
  •   user1596704    9 年前

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