检测应用程序窗口

时间:2010-08-13 15:33:05

标签: windows setwindowshookex window-style

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

我运作良好,但我需要过滤来自普通小部件的事件。实际上,我需要通过CBT钩子通知用户认为是windows的那些窗口。

我所面临的问题让我很生气,因为即使我按照以下过滤窗口,我也会不断发现虚假事件:

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 个答案:

答案 0 :(得分:1)

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

这篇OldNewThing文章解释了规则(尽管规则没有修复或保证保持不变):

一般规则是:

  

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

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

  

带有WS_EX_TOOLWINDOW的窗口   扩展样式被视为好像   不可见,即使它是。一个   带有WS_EX_APPWINDOW的窗口   扩展样式被视为具有   没有所有者,即使它确实如此。

请参阅完整的OldNewThing帖子,这两个引号来自更多细节。

答案 1 :(得分:0)

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