我使用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
或类似的测试,因为有些应用程序可以创建没有边框的主窗口......或者我错了?
答案 0 :(得分:1)
“用户认为是Windows的东西”非常适合在Alt-Tab列表(或任务栏)中显示的一组窗口。
这篇OldNewThing文章解释了规则(尽管规则没有修复或保证保持不变):
一般规则是:
对于每个可见窗口,向上走 所有者链直到找到根 所有者。然后走回可见的地方 最后一个活跃的弹出链,直到找到 一个可见的窗口。如果你回来了 在你开始的地方,然后把它 Alt + Tab列表中的窗口。
这可以使用显式窗口样式覆盖:
带有WS_EX_TOOLWINDOW的窗口 扩展样式被视为好像 不可见,即使它是。一个 带有WS_EX_APPWINDOW的窗口 扩展样式被视为具有 没有所有者,即使它确实如此。
请参阅完整的OldNewThing帖子,这两个引号来自更多细节。
答案 1 :(得分:0)
我过去使用过的一个有用的标准是测试窗口是否是顶级窗口,即它的父窗口是NULL。