Delphi Firemonkey-消息处理

Delphi Firemonkey-消息处理,delphi,message-queue,delphi-xe2,firemonkey,Delphi,Message Queue,Delphi Xe2,Firemonkey,我目前正试图开发一个基于Firemonkey的项目。我使用Firemonkey作为它的UI功能,因为该项目由许多较小的应用程序组成,每个应用程序都有一个3D方面。我目前只使用FMX框架开发/部署到Windows,但以后可能会跨平台 通过在后台构建一个VCL Windows应用程序来执行一个非常具体的操作,然后构建一个FMX前端,我解决了我遇到的大多数问题。但是,这仅适用于只希望执行应用程序以执行其设计的操作,从而可以使用参数执行应用程序的情况。在其中一个应用程序中,我发现需要使用消息(或类似的东

我目前正试图开发一个基于Firemonkey的项目。我使用Firemonkey作为它的UI功能,因为该项目由许多较小的应用程序组成,每个应用程序都有一个3D方面。我目前只使用FMX框架开发/部署到Windows,但以后可能会跨平台

通过在后台构建一个VCL Windows应用程序来执行一个非常具体的操作,然后构建一个FMX前端,我解决了我遇到的大多数问题。但是,这仅适用于只希望执行应用程序以执行其设计的操作,从而可以使用参数执行应用程序的情况。在其中一个应用程序中,我发现需要使用消息(或类似的东西)。例如,在我的FMX应用程序中,如果我单击“button1”,我希望它向后台VCL应用程序发送消息以执行“action1”,而不是使用参数执行它

一个很好的例子是在后台应用程序中使用VCL TMediaPlayer,前端FMX应用程序用于显示信息并提供播放、暂停等控制,这样它基本上就变成了一个具有VCL功能的FMX UI

到目前为止,我还无法通过本地帮助文件或广泛的谷歌搜索找到Firemonkey如何处理消息(例如,在VCL中,它们将通过“SendMessage”或“PostMessage”或类似的方式处理)。我找到的所有东西都与电子邮件有关(大概是因为我大部分搜索词中都有“Message”一词)

有人能给我指出Firemonkey/FMX如何处理消息的正确方向吗?

问候,,
斯科特·普里查德(Scott Pritchard)

我的理解是Firemonkey不是基于传统的窗口,因此向Firemonkey控件发送窗口消息通常不是一个选项。尽管有些控件确实使用windows(最重要的是,
TCommonCustomForm
),但您可以在需要时使用
FMX.Platform.Win
单元中的
FmxHandleToHWND()
函数从
TFmxHandle
中提取
HWND
。如果可能的话,我不知道如何在FMX控件中接收和自定义处理窗口消息

Windows下的Firemonkey可以访问Win32 API,因此不应阻止您向其他窗口控件(如VCL UI)发送窗口消息。在
uses
子句中包含
Winapi.Windows
单元以访问Win32 API函数,就像在VCL应用程序中一样


更新:由于FireMonkey不公开对发送到表单窗口的消息的访问,因此必须手动对窗口进行子类化,以便在FireMonkey看到消息之前接收消息。您可以重写表单的
CreateHandle()
方法,首先调用
inherited
方法来创建窗口,然后使用
FmxHandleToHWND()
来获取可以子类化的
HWND
。在调用
inherited
释放
HWND
之前,请确保重写
DestroyHandle()
方法以删除子类。当前,FireMonkey没有可用于发送和发布消息的消息处理程序

有可能使用诸如FireMonkey works之类的监听器将事情连接起来,但这些都没有文档记录

因此,这里是我所做的:


我创建了自己的自定义“消息”类。我创建该类的实例,并将它们从需要创建的任何线程添加到线程安全列表中。在主线程上,我有一个计时器来检查列表并处理“消息”。

你知道你可以在同一个应用程序进程中使用VCL和FMX,不是吗?好吧,这确实需要一些额外的工作,但在技术上是可能的,并且有第三方库和文章向您展示如何做到这一点。因此,如果您只需从FMX UI事件处理程序调用VCL按钮的
Click()
方法,就不需要直接处理窗口消息(或者更好地,将共享代码隔离在它自己的函数中,VCL和FMX都可以在需要时调用)。