gpt4 book ai didi

delphi - 列出现有对象以读取和更改其属性的理想方法是什么?

转载 作者:行者123 更新时间:2023-12-03 15:40:08 25 4
gpt4 key购买 nike

我正在尝试在 Delphi XE2 中开发一个应用程序,该应用程序将能够读取和更改不同应用程序之间的对象属性。

目前,我们唯一的目标应用程序是用 Delphi XE 开发的应用程序(我有源代码)和用 VB6 开发的应用程序(我们没有源代码或信息)。

我们正在寻找的主要对象是标签和编辑,但理想情况下,我几乎需要设计一个对象查看器,列出每个对象及其属性,能够随意读取和更改这些对象,并调用方法。

我不知道如何做到这一点,我得到的最好的办法是能够读取一些标签标题,基于读取 VB 应用程序上的缓冲区并直接使用内存分配,但即使这样也有其局限性,因为它只能在 WinXP 中运行,而不是像预期的那样在 Windows 7 中运行。

实现我想要的目标的最佳方法是什么?如果最好的话,我愿意用不同的语言进行编码。

编辑:做了更多研究后,我发现了 TestComplete,其中有一个对象查看器,基本上可以列出/修改对象及其属性。
目标不是使用第三方软件来做到这一点,很明显这是可行的,但我不知道如何做。 MSAA/IAutomation 在一定程度上发挥了作用,但都无法真正列出所有对象。

以下几个屏幕简要展示了其工作原理(使用第 3 方 VB 应用程序,为了安全起见,编辑了部分内容):

TestComplete Object Browser TestComplete Object Browser 2

最佳答案

列出现有对象并读取/修改其属性的理想方式是什么?

没有什么比理想的方式更好的了。要么您了解该应用程序并拥有一些接口(interface)(或从内部了解它),要么您必须遵守可用的内容。如果您的目标是具有常见 Windows 控件的 Windows 应用程序,那么 Windows API 就是您所需要的。

但是,并非您在屏幕上看到的所有控件都可以通过 Windows API 访问,不幸的是标签就是其中之一。一般来说,只有窗口控件,那些有句柄的控件才能通过Windows API访问。

如何创建一个对象查看器,列出(外部应用程序的)每个对象及其属性,能够读取和修改这些属性并调用对象的方法。

对象列表(从 Windows API 的角度来看)非常简单,您需要从要检查的目标应用程序获取窗口的句柄并枚举其子窗口(或者更好地将它们称为组件)时间),代码如 this one .
但是,您可以从此类枚举中获得唯一两个相关的内容 - 组件句柄及其类名。每个组件实例都有自己的、一次唯一的系统范围标识符和由类名标识的类类型。

有人可以说,这很酷,我可以获取系统范围的组件标识符和类类型,因此我可以通过发送组件的特定 Windows 消息来统治整个 Windows 中的每个组件,但是...
谁会期望以相同方式处理和响应相同消息的组件的类名可能不同?

好吧,您的噩梦称为子类化,它允许开发人员使用新类名下的新功能来扩展现有组件。作为一个著名的例子,可以使用基本的 Windows 编辑框类 EDIT 和我们的 Delphi 子类类型 TEdit。两者都可以由同一组消息控制,并且行为相同,但从您的角度来看,这只是另一个问题,因为您必须记住,如果您找到具有 TEdit 类的组件type 您必须像 EDIT 类组件一样控制它。

现在您知 Prop 有特定句柄的组件是什么类型,剩下的就是选择可与该组件类型一起使用的正确函数(消息)集。您需要的一切都可以在 MSDN reference pages 上找到
。有所有可用的常用控制功能,包括用于获取或设置某些组件属性的功能,最好是在那里浏览。

关于调用外部应用程序对象方法。幸运的是,这是不可能的,我什至不想想象恶意软件或编写糟糕的应用程序在没有任何限制的情况下从一个进程到另一个进程调用彼此的函数可能会导致什么。

关于delphi - 列出现有对象以读取和更改其属性的理想方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10096071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com