【发布时间】:2015-11-21 04:16:41
【问题描述】:
我正在向我的应用程序发送消息 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 下测试
【问题讨论】:
-
".. 发送到应用程序句柄的消息被重定向到主窗体.." - 不。
-
如何接收消息?:通过为该消息编写消息处理程序。 为什么消息没有重定向到主窗体?:我们怎么知道?您还没有显示消息是如何(或从何处)发送的。请为发送消息的小应用和不接收消息的小应用提供 MCVE。
-
Don 的回答是“酌情”将消息转发到主窗体。它实际上只是主窗体和应用程序窗口假装为单个窗口所必需的少数消息。 wm_CopyData 消息不在其中。您可以检查 Forms.pas 以确认 Don 的断言。
-
在两边创建一个隐藏窗口(@987654324@)和
RegisterWindowMessage(足够独特)。在发送方使用发送方隐藏窗口的句柄广播注册的消息。当接收方收到该消息时,它们通过发布(因为最好避免同步SendMessage(Timeout))使用自己的句柄将相同的消息发送到接收的发件人的窗口来响应(并且可以选择存储发件人的句柄,以便他们彼此了解)。发送者接收他们的句柄并建立一个接收者的集合。 -
如果您想使用 TApplication.OnMessage 事件接收消息,您需要在单独的类中处理它(类型 TAppMessageHandler = class... OnMessage...),Application.OnMessage = MyMessageHandler。消息;收到消息后,您可以将其发送到 Application.MainForm
标签: delphi messages wm-copydata