0

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

4

2 回答 2

1

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

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

一般规则是:

对于每个可见窗口,沿着其所有者链向上走,直到找到根所有者。然后沿着可见的最后一个活动弹出链往回走,直到找到一个可见的窗口。如果您回到开始的位置,则将窗口放在 Alt+Tab 列表中。

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

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

有关更多详细信息,请参阅这两个引用来自的完整 OldNewThing 帖子。

于 2010-12-25T22:59:28.613 回答
0

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

于 2010-12-25T22:07:16.273 回答