2010-07-29 80 views
2

我正在研究一个小的宏记录/重放工具,它可以自动化我们拥有的一些非常古老的Visual Basic 6 GUI。为此,我通过名称来识别控件(即控件的name属性的值,即)。如何获得给定其HWND的Visual Basic控件的名称?

该工具的一部分需要根据HWND来确定控件的名称。对于使用VB.NET完成的较新的Visual Basic应用程序,我可以使用WM_GETCONTROLNAME窗口消息。这很好地工作。

但是,此消息不被旧窗口所理解。有没有什么办法来控制Visual Basic 6应用程序?一个不需要在GUI过程中的解决方案将是可取的,但如果我有一个解决方案只能在GUI过程中使用,那么这也是可以接受的(因为我可以自己做注射)。

UPDATE:有一件事我只是想,这个温和的成功:我用AccessibleObjectFromWindow检查,显示给定的HWND对象的IAccessible接口的实现。如果我得到一个实现(似乎许多[所有?] Visual Basic控件实现此接口),我使用accName属性读出“可访问的名称”。有时候这会产生一个有用的字符串,但通常不会。

回答

1

我相信唯一的办法就是进入进程并获得一个指向Form对象的指针,但我不知道如何从外部做到这一点。

是否有可能将WM_GETCONTROLNAME的支持添加到那些较旧的应用程序中?

或者,也许你可以通过其他一些本地可用的属性来识别控件?

除此之外,正如Raymond所说,there isn't much you can do

+0

这些都是虔诚的建议,谢谢!现在看来我需要挂钩进程(我可以这样做),然后直接访问Form对象。我不知道该怎么做,但几个月前已经做了类似的事情,所以它可能会解决。 – 2010-07-30 08:17:28

1

你可以修改vb6应用程序吗?如果是这样,在每个表单加载事件中,您可以迭代me.controls并使用SetProp(ctrl.hwnd, "MYNAME:" & ctrl.name, 0) api将名称添加到窗口自己的属性列表中,然后在其他应用程序中,您可以EnumProps(ctrl_HWND)查找以MYNAME:开头的值并解析出值。

+0

很有创意的想法!但是 - 不,我不能修改应用程序。我相信我甚至没有可以访问的源代码。有人告诉我,有一种工具可以用来读出给定GUI的Visual Basic名称,显然一些GUI测试工具也可以这样做 - 所以它肯定有可能。 – 2010-07-31 11:09:46

相关问题