【问题标题】:Is a control tree cached after the first call to FindWindowEx/EnumChildWindows?第一次调用 FindWindowEx/EnumChildWindows 后是否缓存了控件树?
【发布时间】:2010-04-04 07:17:23
【问题描述】:

我注意到,如果您针对属于不在前台的窗口(即最小化)的 hWnd 调用 FindWindowExEnumChildWindows,那么它们不会报告任何子级。另一方面,如果我首先在我正在查询的窗口上调用SetForegroundWindow,然后在FindWindowExEnumChildWindows 之后,他们会报告所有的孩子。即使我感兴趣的窗口不在前台,下一个调用也会报告所有孩子。几乎是在第一次调用后进行某种缓存?

【问题讨论】:

    标签: c++ windows user-interface winapi windowing


    【解决方案1】:

    这是您自己的应用程序中的一个窗口,还是您正在调查第三方应用程序的功能?

    我猜这个应用程序只会在它第一次进入前台时创建它的子窗口;这将解释您所看到的行为。据我所知,EnumChildWindows 不执行任何缓存。

    【讨论】:

    • 这是另一个应用程序,我的意思是,为了让 EnumChildWindows 报告任何子窗口,目标窗口需要在前台,至少第一次是这样。该窗口在调用 EnumChildWindows 之前已经创建了它的子窗口,我可以看到所有子窗口,但如果它不在前台几乎就像它没有任何子窗口一样。
    • @Ion:如果如您在问题中所说,当您调用 EnumChildWindows 时窗口被最小化,您如何确定子窗口已经创建?或者如果窗口可见(即未最小化)但不在前景中,也会发生这种行为?
    • 这是正确的,即使窗口可见但不在前台。
    • 我很确定 EnumChildwindows 确实在缓存之外运行 - 我的意思是,程序员可能在他们的 EnumChildWindowProc 中做的一件事是更改枚举子窗口的顺序或状态。如果 EnumChildwindows 不枚举缓存的 hwnd 集合,则无法使用它。
    • @Chris:是的——事实上,文档对此做了一些非常具体的陈述:“在枚举过程中以 Z 顺序移动或重新定位的子窗口将被正确枚举。函数不会枚举在枚举之前被销毁或在枚举过程中创建的子窗口。”由于某些信息即使在枚举过程中也会明显更新,但我希望在调用 EnumChildWindows 时状态是最新的。
    猜你喜欢
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2018-07-22
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多