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

M. *_* R. 3 delphi automation

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

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

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

我对如何这样做感到茫然,我得到的最好的是能够读取一些标签标题,基于读取VB应用程序上的缓冲区并直接处理内存分配,但即使这样也有它的局限性,因为它只能工作在WinXP中,而不是像预期的Windows 7.

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

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

下面是几个屏幕,简要介绍它是如何工作的(使用第三方VB应用程序,为了安全起见,编辑了部分):

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

TLa*_*ama 6

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

没有什么比理想的方式了.要么你知道应用程序并有一些接口(或从内部知道)或你必须符合可用的.如果您的目标是具有常见Windows控件的Windows应用程序,那么Windows API就是您正在寻找的.

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

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

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

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

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

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

关于调用外部应用程序对象方法 幸运的是,这是不可能的,我甚至不想想恶意软件或编写错误的应用程序可能会导致什么原因导致彼此从一个进程调用另一个进程而没有任何限制.


Tor*_*ins 5

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

  • MSAA需要得到程序员使用的框架的支持.例如,VCL对它的支持非常差,Flash和HTML - 非常好.不知道VB和C#.Java拥有自己的辅助技术. (3认同)