【问题标题】:How to figure out what a general hWnd represents?如何弄清楚一般的 hWnd 代表什么?
【发布时间】:2017-02-12 08:54:06
【问题描述】:

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

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

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

当我试图“定义”什么是 Window\Form 来手动检查它(比如它是否有标题栏)时,不同对象之间的边界真的很模糊。

获取类名当然不是一种选择,因为一般来说它们是非常随意的。

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

【问题讨论】:

    标签: c# windows winapi ui-automation


    【解决方案1】:

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

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

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

    我发现 .Net Framework 中的 Microsoft 自动化 UI 在某些方面是如何区分对象的,有什么线索是如何做到的吗?

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

    AUI 如何确定它发现了什么?

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


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

    【讨论】:

    • RealGetWindowClass() 可能是更好的选择。
    猜你喜欢
    • 2011-09-19
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 2018-05-16
    • 2014-05-15
    • 2013-11-21
    相关资源
    最近更新 更多