在 Firemonkey 表单上收到 WM_COPYDATA 条消息?

Receive WM_COPYDATA messages on Firemonkey form?

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

如何在 Firemonkey 表单上接收诸如 WM_COPYDATA 之类的消息?

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

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

在任何情况下,您的 VCL 代码都有些不稳定,因为它假定不会重新创建表单的 window。 window 将被重新创建是完全合理的,因此使用表单的 window 句柄作为消息收件人是一种可疑的做法。

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

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