【发布时间】:2013-02-20 03:25:19
【问题描述】:
大家早上好。
我目前正在尝试编写一个小型应用程序,该应用程序围绕通过 Windows DWM API 提供的功能(例如 DWM 缩略图)构建。一个这样的功能是能够从应用程序中动态选择缩略图的一个区域,并将其放大/放大。可以通过某种“设置区域”功能从 DWM 执行此操作,但我在深入 API 之前,想先尝试一下我自己的路线。
最近找到an example for Delphi,我希望从演示中扩展并构建更具体的东西。我着手将代码移至Firemonkey FM2 应用程序(因为与VCL 相比,我更喜欢框架的视觉功能)。通过一些调整,我设法构建了它,但不幸的是,在 FMX 应用程序中运行时,DWMRegisterThumbnail 似乎不会返回有效结果,尽管 VCL 版本运行完美。
然后我又看了看,决定试一试九头蛇。我将工作的 VCL 示例复制到 Hydra 插件中,并创建了一个 Firemonkey 主机应用程序。我正确设置了两个部分并进行了编译。 DLL 正确加载,我可以按预期在 FMX 主机内看到 VCL 插件接口。但是,在尝试查看窗口的 DWM 缩略图时,我再次遇到了运行非 hydra FMX 应用程序时遇到的相同问题。
然后我开始创建一个 VCL 主机应用程序,以确保它不是特定于 VCL-FMX 交互的问题。我编译了 VCL 主机,加载到 VCL 插件中,我再次可以在 VCL 主机中看到 VCL 插件。然而再一次,我仍然发现我无法从 DWM 查看缩略图。显然,这不是 Firemonkey-VCL 交互问题。
因此,我断定这是从 DLL 运行 DWM 代码的问题。理想情况下,我希望有一个 FMX 主机应用程序,因为我更容易将 TSelection 放在缩略图上,并以这种方式处理缩放(例如非常少的代码,并且无需寻找自定义组件) 更不用说MakeScreenshot等额外奖励了。
所以,切入正题; 是否可以从 Hydra 插件调用 DWM API,和/或将 DWM 缩略图输出到 Firemonkey 表面?
在我的 Hydra 插件中使用的代码与在 linked example 中使用的代码相同,在我的主机应用程序中使用的代码是 based upon the simple example on the Remobject Youtube Channel。
【问题讨论】:
-
DWM 在 DLL 中运行良好。为什么要对我们隐藏代码?
-
您走了一条非常复杂的路线才能到达这里(Hydra?DLL?托管应用程序和插件?!)另外,我不遵循您的逻辑,为什么您“得出结论认为这是运行来自 DLL 的 DWM 代码”,尤其是因为它首先从一个简单的 FMX 应用程序失败。下一次,当你到达第一点时问一个 SO 问题,即
DWMRegisterThumbnail你的 FMX 应用程序失败:) -
这不是隐藏代码的情况,只是我不想引用我链接的源中的内容,并且除了我的问题之外还有一堵文字墙(这是已经很长了)。我断定这是一个 DLL 问题,只是因为我无法从 VCL 或 FMX 主机上运行它。这可能是我错误地将代码移动到所说的 DLL 并完全依赖它的情况,所以这是我的一个诚实的错误。
标签: delphi firemonkey dwm remobjects firemonkey-fm2