MiniSpy






4.96/5 (24投票s)
2002年1月13日
3分钟阅读

260844

7005
一个动态窗口属性查看器,用来代替 Spy++
引言
(版本 2.0)我经常使用 Spy++ 来追踪窗口消息,但很少用它来查看窗口的属性。
当我使用它时,我发现查找工具非常笨拙,因为它提供了一个静态界面,而我认为这是一个更加动态的活动。
因此,我决定看看是否可以设计一个替代界面,让我能够以最少的麻烦查看窗口的属性。
结果就是 MiniSpy。
它没有什么特别之处,但它确实提供了以下功能
- 所有属性在一个窗格中可见
- 当你拖动它时,动态更新
- 为所有标准窗口和通用控件分别显示控件特定的样式,而不是标准窗口样式。
- 提供一个过滤器下拉列表,这样,如果你注册了自己的窗口类,并且它基于标准控件类,你可以手动选择基本窗口类来查看控件样式
- '刷新'按钮,用于刷新当前窗口的属性
- 提供工具提示以查看长行
历史
新功能 (2.0)
- '锁定更新'按钮/快捷方式,以防止在移动 MiniSpy 时更新所选窗口。
- 用于导航到父窗口、第一个子窗口、下一个/上一个窗口的按钮/快捷方式(注意:这些按钮将自动锁定更新,以防止新窗口立即被覆盖)。
- 垂直工具栏,以便所有按钮都可见。
- 手动实现
RealWindowFromPoint()
,用于 win95 (参见下面的错误修复 (1.2))。 - 添加了 tooltips_class32 的控件样式。
错误修复 (2.0)
- 缺少菜单 (#32768)、桌面 (#32769)、图标标题 (#32772)、tooltips_class32、任务切换器 (#32771) 类名已添加到过滤器组合框。
新功能 (1.2)
- 显示窗口响应
WM_NCHITTEST
消息返回的“命中测试”结果
错误修复 (1.2)
- 正确选择组框包含的窗口。感谢 Philippe Lhoste (PhiLho@GMX.net)
以前,MiniSpy 使用方法
::WindowFromPoint()
来选择窗口。但是,正如 Philippe 指出的那样,这并不总是适用于组框内的控件,特别是当控件在 z 顺序中位于组框后面时。为了解决这个问题,我扩展了窗口选择,在完成初始选择后,也使用
::RealChildWindowFromPoint()
。此函数的文档有效地说明它会忽略对WM_NCHITTEST
消息返回HTTRANSPARENT
的窗口,而组框就是这样做的。这解决了问题,但嵌套组框除外,因为
::RealChildWindowFromPoint
也会忽略它们,因为它们也返回HTTRANSPARENT
。文档还表明 Windows 95 不支持
::RealChildWindowFromPoint()
,这就是我动态链接它的原因。
新功能 (1.1)
- 可以使用它的任何一个角来选择窗口
- 显示窗口属性(通过
EnumPropsEx
) - 包括 richedit
ES_
样式 - 包括 richedit
ENM_
样式 - 包括工具栏和状态栏的通用控件 CCS_ 样式
- 提供“恢复大小”按钮以返回到启动大小
错误修复 (1.11)
- 在使用 EnumPropsEx() 枚举属性时,在 XP 下崩溃。感谢 limax (limax@hot.ee)。
关于源代码的一些评论
- 所有使用的类、窗口、windowEx 和控件样式都位于 *styles.h* 中。如果我遗漏了任何内容,请随时将它们添加到您的版本中,并通过邮件发送给我进行添加
- 我决定让 MiniSpy“始终位于顶部”,因为我发现它在这种模式下最有用,但是当我在列表控件中打开工具提示时,这些工具提示会出现在 MiniSpy 窗口后面!由于工具提示对于样式行来说是一个非常有用的功能,我想出了一个有趣的解决方法:我处理
WM_ACTIVATEAPP
,并在 MiniSpy 不是活动窗口时使其“位于顶部”,而在它是活动窗口时使其“不位于顶部”。 - 为了检索窗口及其父窗口的窗口标题,我使用了
WM_GETTEXT
而不是GetWindowText
。这仅仅是因为,由于某种原因,在这种情况下,GetWindowText
对于某些窗口似乎不起作用。