3

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

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

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

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

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

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

这里有几个屏幕简要展示了它是如何工作的(使用第 3 方 VB 应用程序,为安全起见已编辑部分):

TestComplete 对象浏览器 TestComplete 对象浏览器 2

4

3 回答 3

6

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

没有什么像理想的方式。要么你知道应用程序并且有一些接口(或者从内部知道它),要么你必须符合可用的东西。如果您的目标是具有通用 Windows 控件的 Windows 应用程序,那么您正在寻找 Windows API。

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

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

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

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

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

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

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

于 2012-04-10T23:43:09.710 回答
5

除了 WinAPI,您还可以使用 Microsoft Active Accessibility 从其他窗口获取信息。这是一个小例子: http: //blogs.msdn.com/b/oldnewthing/archive/2004/04/23/118893.aspx和德尔福代码:http ://www.transl-gunsmoker.ru/2009/08/ blog-post.html

于 2012-04-11T09:06:35.603 回答
1

使用 RTTI 和 Indy TidTCPServer 很容易将基于文本的“类似 telnet”的对象浏览器/编辑器添加到任何 Delphi 应用程序。我已经在几个应用程序上完成了这项工作,组织了表单和组件结构,使容器显示为“文件夹”,组件显示为“文件”。它可能很有用..而且很有趣。当他们的应用程序突然在他们面前改变颜色,或者逐渐变得越来越高越来越薄时,这让用户有点不安。然后我得到的错误报告很有趣,(不,你是对的,我不应该这样做,即使对营销经理也是如此)。

我不明白为什么不能用 treeView 构建基于表单的浏览器。单击组件节点可以打开一个表单,其中列出了属性并允许对其进行编辑。IIRC,我只能像这样调用已发布的方法。

OTOH,我不知道如何有效地使用 VB 应用程序。VB 不是我喜欢在没有足够保护的情况下接近的东西,而且那些防护服也很不舒服。

于 2012-04-10T20:48:23.533 回答