背景:针对特定的软件编写自动化测试软件。现被测试软件有些控件需要通过反射才能取到,目前遇到一个问题,我得到了句柄,可是得不到窗口对象,也就无法通过反射获取窗口的某些控件。
不同进程,无法通过 Form.FromHandle 获取控件对象。
该控件是第三方自定义控件,它与其它几个按钮包含在一个容器里,目前我拿到了容器的句柄,想要得到这个容器的对象,通过反射获取控件。
可以通过软件获取窗口的句柄,然后invoke的方式调用win32 api,点击窗口的按钮
常识性问题:能得到句柄一定能得到控件对象;但得到控件对象不一定得到句柄(但这种模式往往也会提供获取窗口或者父节点之类的接口)。
那应该是在同一进程里才可以获取。我是不同的进程
@l青梅煮酒: 我说的就是通过不在一个进程处理的. 先小工具获取进程窗口句柄,通过FindWindow( win32 api),拿到句柄,然后进行操作
@秋壶冰月: 不同进程是可以获取到句柄的。
关于控件的句柄这取决于实现(的视图体系)方式,比如wpf视图体系、一些游戏的视图体系、自己的一套视图体系等这都不是基于句柄的,这些视图体系只有窗口才具有句柄。基于user32控件模型的,那么可以直接操作之,其他的只能以基点(比如HWND)为入口操作对象。
@秋壶冰月: 目前我正是使用 FindWindow 获取到了窗口句柄,也拿到了容器句柄。但是无法对容器进行操作,我需要反射这个容器拿到容器里面的控件。
@花飘水流兮: 所以 此路不通嘛?(;′⌒`)
@l青梅煮酒: 可以通过SendMessage 发送消息,具体要看win32 消息机制
@秋壶冰月: 尝试过,这个函数对具体的控件句柄是有效的(我向登录按钮发送鼠标点击消息),但是接下来的一步只能拿到容器句柄,故而无法对它进行什么操作。
@l青梅煮酒: 获取不到具体某个控件(文本框)的句柄吗? 实在获取不到的话,可以考虑用坐标的方式
@秋壶冰月: 获取不到呢,坐标的方式已经实现了。但是觉得不太稳妥,想要再看看其他的方案。
@l青梅煮酒: 我没什么好办法了
@秋壶冰月: 嗯嗯,非常感谢你的热心帮助。