如何在给出HWND的情况下获取Visual Basic控件的名称?

时间:2010-07-29 16:50:49

标签: vb6 automation

我正在开发一个小的宏记录/重放工具,它可以自动化我们拥有的一些非常古老的Visual Basic 6 GUI。为此,我通过名称识别控件(控件的name属性的值,即)。

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

但是,旧窗口无法理解此消息。有没有办法对Visual Basic 6应用程序的控件执行此操作?一个不需要在GUI过程中的解决方案将是首选,但如果我有一个只在GUI过程中工作的解决方案,那么这也是可以接受的(因为我可以自己进行注入)。

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

2 个答案:

答案 0 :(得分:1)

我认为唯一的方法是进入流程并获取指向Form对象的指针,但我不知道如何从外部执行此操作。

是否可以为这些旧应用程序添加对WM_GETCONTROLNAME的支持?

或许,您可以通过其他一些本机可用的属性来识别控件?

正如雷蒙德所说的那样,there isn't much you can do

答案 1 :(得分:1)

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