代码之家  ›  专栏  ›  技术社区  ›  Luca

检测应用程序窗口

  •  0
  • Luca  · 技术社区  · 15 年前

    我用 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 或者类似的,因为一些应用程序可以创建没有边框的主窗口…还是我错了?

    2 回复  |  直到 12 年前
        1
  •  1
  •   Leo Davidson    15 年前

    “用户认为是Windows的东西”的一个很好的选择是显示在alt选项卡列表(或任务栏)中的一组窗口。

    这篇老生常谈的文章解释了规则(尽管规则不是固定的或保证保持不变):

    一般规则是:

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

    这可以用显式窗口样式覆盖:

    带有ws-ex-u工具窗口的窗口 扩展样式被视为 不可见,即使是。一 带有ws-ex-appwindow的窗口 扩展样式被视为 没有主人,即使有。

    请参阅这两个引语来自的完整的旧新闻帖子,了解更多详细信息。

        2
  •  0
  •   Ran    15 年前

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

    推荐文章