首页 新闻 会员 周边

C# 通过句柄获取窗口(窗口类型or对象)

0
悬赏园豆:10 [已解决问题] 解决于 2018-10-11 15:02

请教各位,我如何通过句柄获取窗口对象?

背景:针对特定的软件编写自动化测试软件。现被测试软件有些控件需要通过反射才能取到,目前遇到一个问题,我得到了句柄,可是得不到窗口对象,也就无法通过反射获取窗口的某些控件。

问题补充:

-------------------------------------------------补充-------------------------------------------------

不同进程,无法通过 Form.FromHandle 获取控件对象。
该控件是第三方自定义控件,它与其它几个按钮包含在一个容器里,目前我拿到了容器的句柄,想要得到这个容器的对象,通过反射获取控件。

李怀瑾的主页 李怀瑾 | 初学一级 | 园豆:103
提问于:2018-10-10 18:07
< >
分享
最佳答案
0

可喜可贺,无意中找到了一个大牛封装的框架,完美解决我的问题。还不需要写一大堆查找控件的代码。

这是项目地址,有兴趣的童鞋可以阅读一下
https://github.com/Roemer/FlaUI

李怀瑾 | 初学一级 |园豆:103 | 2018-10-11 15:01
其他回答(2)
0

可以通过软件获取窗口的句柄,然后invoke的方式调用win32 api,点击窗口的按钮

收获园豆:5
秋壶冰月 | 园豆:5903 (大侠五级) | 2018-10-10 18:49
0

常识性问题:能得到句柄一定能得到控件对象;但得到控件对象不一定得到句柄(但这种模式往往也会提供获取窗口或者父节点之类的接口)。

收获园豆:5
花飘水流兮 | 园豆:13560 (专家六级) | 2018-10-11 10:09

那应该是在同一进程里才可以获取。我是不同的进程

支持(0) 反对(0) 李怀瑾 | 园豆:103 (初学一级) | 2018-10-11 11:28

@l青梅煮酒: 我说的就是通过不在一个进程处理的. 先小工具获取进程窗口句柄,通过FindWindow( win32 api),拿到句柄,然后进行操作

支持(0) 反对(0) 秋壶冰月 | 园豆:5903 (大侠五级) | 2018-10-11 11:42

@秋壶冰月: 不同进程是可以获取到句柄的。
关于控件的句柄这取决于实现(的视图体系)方式,比如wpf视图体系、一些游戏的视图体系、自己的一套视图体系等这都不是基于句柄的,这些视图体系只有窗口才具有句柄。基于user32控件模型的,那么可以直接操作之,其他的只能以基点(比如HWND)为入口操作对象。

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2018-10-11 12:36

@秋壶冰月: 目前我正是使用 FindWindow 获取到了窗口句柄,也拿到了容器句柄。但是无法对容器进行操作,我需要反射这个容器拿到容器里面的控件。

支持(0) 反对(0) 李怀瑾 | 园豆:103 (初学一级) | 2018-10-11 13:08

@花飘水流兮: 所以 此路不通嘛?(;′⌒`)

支持(0) 反对(0) 李怀瑾 | 园豆:103 (初学一级) | 2018-10-11 13:12

@l青梅煮酒: 可以通过SendMessage 发送消息,具体要看win32 消息机制

支持(0) 反对(0) 秋壶冰月 | 园豆:5903 (大侠五级) | 2018-10-11 13:12

@秋壶冰月: 尝试过,这个函数对具体的控件句柄是有效的(我向登录按钮发送鼠标点击消息),但是接下来的一步只能拿到容器句柄,故而无法对它进行什么操作。

支持(0) 反对(0) 李怀瑾 | 园豆:103 (初学一级) | 2018-10-11 13:18

@l青梅煮酒: 获取不到具体某个控件(文本框)的句柄吗? 实在获取不到的话,可以考虑用坐标的方式

支持(0) 反对(0) 秋壶冰月 | 园豆:5903 (大侠五级) | 2018-10-11 13:19

@秋壶冰月: 获取不到呢,坐标的方式已经实现了。但是觉得不太稳妥,想要再看看其他的方案。

支持(0) 反对(0) 李怀瑾 | 园豆:103 (初学一级) | 2018-10-11 13:22

@l青梅煮酒: 我没什么好办法了

支持(0) 反对(0) 秋壶冰月 | 园豆:5903 (大侠五级) | 2018-10-11 13:37

@秋壶冰月: 嗯嗯,非常感谢你的热心帮助。

支持(0) 反对(0) 李怀瑾 | 园豆:103 (初学一级) | 2018-10-11 14:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册