如何弄清楚一个通用hWnd代表什么

本文关键字:hWnd 什么 一个 弄清楚 | 更新日期: 2023-09-27 18:11:20

根据MSDN, winAPI函数如WindowFromPoint不返回所有顶层窗口(至少跳过隐藏和禁用),然后我们需要使用更灵活的函数如ChildWindowFromPoint

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

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

当我试图"定义"什么是窗口'表单手动检查它(如如果它有一个标题栏),不同对象之间的边界是真正模糊的。

获取类名当然不是一个选项,因为它们通常是相当随意的。

最后我发现微软自动化UI在。net框架中如何设法区分对象,有线索这是如何做到的吗?似乎需要实现一个复杂的机制,它将比较许多参数来验证它到底是什么,但是AUI如何确定它发现了什么?

如何弄清楚一个通用hWnd代表什么

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

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

窗口类是静态的1,特定窗口类的任何窗口以后都可以更改类模板中指定的一些设置。要获取最新的窗口信息,您可以使用GetWindowLongPtr。

我发现微软自动化UI在。net框架如何设法区分对象,任何线索这是如何做到的?

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

AUI怎么这么确定它发现了什么?

因为它不会猜测UI自动化接口返回的内容。这些都是由控件作者实现的,因此可以假定它是可信的信息。


1 大致正确。您仍然可以通过调用SetClassLongPtr来修改已注册的类。