【发布时间】: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