Firemonkey - 消息处理

5
我目前正在尝试使用Firemonkey开发一个项目。由于该项目包含许多带有3D方面的较小应用程序,因此我正在使用Firemonkey进行UI设计。目前,我只使用FMX框架在Windows上进行开发/部署,但将来可能会跨平台。
我通过在后台构建一个VCL Windows应用程序来解决大多数问题,以执行非常特定的操作,然后建立一个FMX前端界面。但是,仅当您想要执行应用程序以执行其设计用途的那个操作时,这种方法才是合适的,并且可以使用参数执行应用程序。在其中一个应用程序中,我需要使用消息(或类似的东西)。例如,在我的FMX应用程序中,如果我单击“button1”,我希望它向后台VCL应用程序发送一条消息以执行“action1”,而不是使用参数执行它。
一个很好的例子是在后台应用程序中使用VCL TMediaPlayer,在前端FMX应用程序中用于显示信息并提供播放、暂停等控制。这样它就成为了具有VCL功能的FMX UI。
到目前为止,我还没有找到任何与Firemonkey如何处理消息相关的资料(例如,在VCL中,消息会使用“SendMessage”或“PostMessage”等命令执行),无论是通过本地帮助文件还是通过广泛的搜索都找不到。我搜索到的所有内容都与电子邮件有关(可能是因为我的大多数搜索词中都包含“Message”一词)。
请问有人能指点我在Firemonkey/FMX中如何处理消息吗?
谢谢, Scott Pritchard

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

5
我的理解是,Firemonkey不基于传统的Windows,因此通常情况下不能向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。一定要重写DestroyHandle()方法,在调用inherited释放HWND之前删除子类。

3

目前,FireMonkey并没有消息处理程序可用于发送和发布消息。

有一种可能是使用类似FireMonkey内部工作的监听器来连接事物,但没有任何文档记录它。

因此,这里是我所做的:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接