【问题标题】:Firemonkey - Message HandlingFiremonkey - 消息处理
【发布时间】:2012-02-29 11:05:08
【问题描述】:

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

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

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

到目前为止,我一直无法找到关于如何使用 Firemonkey 处理消息(例如在 VCL 中,它们将使用“SendMessage”或“PostMessage”或类似的东西来完成)的任何信息,通过本地帮助文件或广泛的谷歌搜索。我出现的所有内容都与电子邮件有关(可能是因为我的大多数搜索词中都包含“消息”一词)。

Can anyone point me in the right direction on how messages would be handled with Firemonkey/FMX?

问候, 斯科特·普里查德

【问题讨论】:

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

标签: delphi message-queue delphi-xe2 firemonkey


【解决方案1】:

我的理解是Firemonkey不是基于传统的windows,所以发送window消息给Firemonkey控件通常不是一种选择。尽管某些控件确实使用窗口(最值得注意的是,TCommonCustomForm),因此您可以在需要时使用FMX.Platform.Win 单元中的FmxHandleToHWND() 函数从TFmxHandle 中提取HWND。如果可能的话,我不知道如何在 FMX 控件中接收和自定义进程窗口消息。

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

更新:因为 FireMonkey 不公开对发送到窗体窗口的消息的访问权限,所以您必须手动子类化窗口以便在 FireMonkey 看到消息之前接收消息。你可以重写Form的CreateHandle()方法,先调用inherited方法创建窗口,然后使用FmxHandleToHWND()获取HWND,你可以继承它。在调用inherited 释放HWND 之前,请务必覆盖DestroyHandle() 方法以删除子类。

【讨论】:

    【解决方案2】:

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

    有可能使用像 FireMonkey 这样的监听器在内部工作,但没有任何文档记录。

    所以,相反,这就是我所做的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多