如何弄清楚一般hWnd代表什么?

时间:2016-10-04 08:55:29

标签: c# windows winapi ui-automation

根据MSDN,像winAPI这样的WindowFromPoint函数不返回所有顶级窗口(至少隐藏和禁用跳过),然后我们需要使用更多可混合的函数,例如{{1} }。

但是,最后一个函数不仅可以返回窗口,还可以获得任何子控件句柄。

所以我的问题是我应该如何区分我有它的句柄的实际类型,它是一个窗口,按钮,复选框..等等。

当我尝试"定义"什么是Window \ Form手动检查它(如果它有一个标题栏),不同对象之间的边界非常模糊。

获得课程名称当然不是一种选择,因为一般来说它们都是非常随意的。

最后我发现.Net Framework中的Microsoft Automation UI有些如何设法区分对象,任何线索如何做到这一点?似乎需要实现一个复杂的机制,它会比较许多参数来验证它是什么,但是AUI如何确定它找到了什么?

1 个答案:

答案 0 :(得分:4)

  

所以我的问题是我应该如何区分我有它的句柄的实际类型,它是一个窗口,按钮,复选框..等等。

您可以在窗口句柄上调用GetClassName来检索窗口类的文本表示。虽然这可能有助于识别标准控件类,但它对自定义窗口类(通过调用RegisterClassEx引入的类)没什么帮助。

窗口类是静态的 1 ,并且特定窗口类的任何窗口都可以在以后更改类模板中指定的某些设置。要检索最新的窗口信息,您可以使用GetWindowLongPtr代替。

  

我发现.Net Framework中的Microsoft Automation UI有些如何设法区分对象,任何线索如何做到这一点?

UI Automation根本不依赖于窗口句柄。它通过检查和操作可访问树来工作,这是通过COM接口实现的。本机窗口句柄和可访问对象之间没有严格的关系(这就是为什么它适用于无窗口控件的原因,例如大多数浏览器所使用的)。

  

AUI如何确定它找到了什么?

因为它没有猜测UI Automation接口返回的内容。这些是由控制作者实现的,因此可以假设它是值得信赖的信息。

<小时/> 1 这大致正确。您仍然可以通过调用SetClassLongPtr来修改已注册的课程。