【问题标题】:Receive WM_COPYDATA messages on Firemonkey form?在 Firemonkey 表单上接收 WM_COPYDATA 消息?
【发布时间】:2015-01-29 13:57:25
【问题描述】:

我正在将 Windows VCL 应用程序移植到 Delphi XE7 中的 Windows FMX (Firemonkey),并且一直被困在这个问题上......

如何在 Firemonkey 表单上接收 WM_COPYDATA 等消息?

我在表单的protected 部分中有procedure WMCopyData(var msg: TWMCopyData); message WM_COPYDATA;,但从未收到该消息。 VCL 表单上的相同代码可以正常工作。我明白为什么它不起作用(FMX 不使用 Windows 消息循环?),不知道该怎么办。

【问题讨论】:

    标签: delphi firemonkey delphi-xe7


    【解决方案1】:

    Windows 上的 FMX 确实依赖于 Windows 消息循环。但该架构不支持使用message 关键字进行消息传递。

    无论如何,您的 VCL 代码有点不稳定,因为它假定您的表单窗口不会被重新创建。重新创建窗口是完全合理的,因此使用表单的窗口句柄作为消息接收者是一种可疑的做法。

    解决该问题以及解决您的 FMX 问题的最佳方法是创建一个专门用于接收这些消息的任务的窗口。如果你控制了窗口的创建,那么你可以确保窗口只要你需要就一直存在,并且不受 VCL 窗口重新创建的影响。

    在 Windows 平台上,您可以通过从 System.Classes 单元调用 AllocateHWnd 来执行此操作。当然,这是特定于 Windows 的,但 WM_COPYDATA 是特定于 Windows 的,因此您不必担心。

    【讨论】:

    • 没有迹象表明这里的 VCL 代码是易碎的,因为你没有迹象表明他如何找到 WM_COPYDATA 正在发送到的句柄。如果在发送消息之前使用FindWindow 检索到它,则它没有任何问题;没有理由重新创建窗口会成为问题,并且没有任何可疑
    • @KenWhite 不是这样。窗口重新创建可能发生在FindWindow 返回和消息发送到该窗口之间。
    • 当然可以。在调用 FindWindow 和发送消息之间,世界末日可能会到来。如果您使用 WM_COPYDATA 在应用程序之间进行通信,您通常会发送消息,然后,如果您在合理的时间内没有收到回复,您只需再次发送即可。在极少数情况下失败的可能性很小并不符合国际海事组织不稳定可疑的条件。
    • @KenWhite 我想我总是选择亲自控制窗把手的使用寿命。
    • 您仍然有同样的初始问题:如何将窗口句柄从您的应用程序获取到另一个应用程序(WM_COPYDATA 的发送者)。你是怎样做的? (再次FindWindow。)
    猜你喜欢
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多