【问题标题】:Detect application windows检测应用程序窗口
【发布时间】:2010-08-13 15:33:04
【问题描述】:

我使用CBT Windows Hook 来检测窗口创建/删除/最小最大/移动大小事件。

我工作得很好,但我需要过滤来自普通小部件的事件。实际上,只有那些用户认为是窗口的窗口才需要通过 CBT 挂钩通知我。

我面临的问题让我很生气,因为即使我按以下方式过滤窗口,我也会不断收到虚假事件:

BOOL FilterWindowHandle(HWND hwnd)
{
    // Filtered window having WS_CHILDWINDOW style
    if ((GetWindowLongPtr(hwnd, GWL_STYLE) & WS_CHILDWINDOW) != 0)
        return (TRUE);
    // Filtered window not having WS_CAPTION style
    if ((GetWindowLongPtr(hwnd, GWL_STYLE) & WS_CAPTION) == 0)
        return (TRUE);
    // Not filtered
    return (FALSE);
}

那些虚假事件来自阴影效果、菜单和屏幕上显示的所有内容。

是否有可靠的方法从其子窗口中过滤出真实窗口?

我避免使用WS_BORDER 或类似的测试,因为某些应用程序可以创建没有边框的主窗口......还是我错了吗?

【问题讨论】:

  • 你是有一定标准的人。您对什么是“真实窗口”有一个定义,这与操作系统认为的窗口不同。定义该标准,并编写代码以匹配它。提示:使用 Spy++ 查看系统上窗口的窗口样式,加上 MSDN 应该可以帮助您找到解决方案。
  • @tenfour 说起来容易做起来难! ;)
  • 也许可以,但无论哪种方式,最终您都必须知道自己在做什么,以及样式的含义。没有人说编程很容易:)
  • 您可以使用辅助工具,例如 Windows 自动化:blogs.msdn.com/b/winuiautomation/archive/2009/06/03/…msdn.microsoft.com/en-us/windows/bb735024,因为它们应该“过滤”无意义的窗口。

标签: windows setwindowshookex window-style


【解决方案1】:

“用户认为的窗口”非常适合显示在 Alt-Tab 列表(或任务栏)中的一组窗口。

这篇 OldNewThing 文章解释了规则(尽管这些规则并不固定或保证保持不变):

一般规则是:

对于每个可见的窗口,向上走 所有者链,直到找到根 所有者。然后走回可见的地方 最后一个活动的弹出链,直到你找到 一个可见的窗口。如果你回到 你从哪里开始,然后把 Alt+Tab 列表中的窗口。

这可以被显式的窗口样式覆盖:

带有 WS_EX_TOOLWINDOW 的窗口 扩展样式被视为 不可见,即使它是。一种 带有 WS_EX_APPWINDOW 的窗口 扩展样式被视为具有 没有所有者,即使有。

有关更多详细信息,请参阅这两条引述的完整 OldNewThing 帖子。

【讨论】:

    【解决方案2】:

    我过去使用的一个有用标准是测试窗口是否为顶级窗口,即其父窗口是否为 NULL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多