Delphi工具之WinSight

WinSight: 窗口侦查(Spying on Windows)

Note

WinSight在Win7下无法正常工作,因此我们在XP环境下介绍下WinSight工具。

WinSight是一个工具,用户可以使用这个工具来侦查Windows。WinSight显示正在运行的每一个应用程序及应用程序的每一个窗口(别忘了,控件也是窗口)。同时WinSight也显示Windows产生的每一条消息(即发送到窗口的每一条消息)。

用户可选择查看所有消息或查看发送某个特定窗口的消息。要启动WinSight,可在Windows资源管理器中先找到WS32.EXE并双击该文件(该文件在Delphi7\Bin目录下)。像Image Editor一样,WinSight也是一个独立程序,可以在Delphi IDE以外运行。如下图,正在侦查Windows资源管理器的WinSight。

快照1

从上图可以看出,WinSight窗口分成两个窗格,上面的窗格列出了活动的窗口,下面的窗格显示发送到某个特定窗口或全部窗口的消息。拖动两个窗格之间的分隔条可以调整窗格的大小。缺省时,WinSight窗口被水平分割成两部分;单用户也可以选择垂直分割。如下图:

快照2

要改变WinSight窗口的布局,可从【View】菜单选择【Split Horizontal】或【Split Vertical】菜单项。

下面我们先介绍一下Windows消息。

窗口消息接送系统(The Windows Messaging System)

如果对Windows不了解,那么侦查Windows也是徒劳无益的。因此,用户必须花上一定时间来学习Windows编程,才能真正理解WinSight所显示的所有信息。

Delphi是一个高级平台,使用户能在最短的时间内编写出真正独立的Windows应用程序。如果要说这个编程环境有缺点的话,那就是用户没有机会了解是什么东西真正驱动Windows应用程序运行。

驱动Windows应用给程序运行的是消息,许多许多的消息。Windows发送一条窗口消息来指示窗口的动作或通知窗口某个事件已发生。例如,当一个窗口要刷新时,Windows给它发送一条WM_PAINT消息,这条WM_PANIT消息指示该窗口进行刷新。

当一个窗口被改变大小时,Windows发送一条WM_WINDOWPOSCHANGING 消息通知窗口,其大小或位置正在改变;当修改完窗口的大小和位置后,还要发送WM_WINDOWPOSCHANGED消息和WM_SIZE消息到该窗口。在一个普通Windows环境中,消息发送在一秒内要发生几十次甚至几百次。

Windows能发送给应用程序的消息有100多条。在前面的讲解中,已经讲述过少量Windows消息。Delphi程序响应的许多事件都是Windows消息。OnCreate事件是响应WM_CREATE消息所产生的。还可以继续举例下去。Delphi使用户能在更高层次上处理消息,因而用户不用编写应用程序中更重要的部分。

最终,用户会想知道:是什么驱动Windows运行。Delphi的最大优点是:用户能很快学会编写Windows程序,并逐步了解更深层次的内容。

Note

一些非常优秀的Windows程序员可能要说:应该先学习用C语言编写Windows程序;他们认为,C语言编程基础对每一个Windows程序员都是必须的,不论他使用何种编程环境。尽管作者也赞同这是一个最佳设想,但仍然认为,今天很少有程序员能花这么多时间来学习C语言编程。

简要介绍Windows消息后,我们回过头来看WinSight是如何工作的。

 

窗口的侦查(Spying on a Window)

WinSight窗口的上窗格称作窗口树。窗口树显示当前打开的所有窗口;它还显示有关某个特定窗口的窗口类的一些详细信息。该信息以如下的形式显示:

image

Overlapped 0007013C {CabinetWClass} Explorer.EXE (879,80)-(1679, 680) “E:\HyperSnap 7”

该行第一项指明窗口的窗口类型。此处是一个重叠窗口(WS_OVERLAPPED窗口);其他的窗口类型有子窗口、弹出式窗口等,重叠窗口、子窗口和弹出式窗口是最常用的窗口类型。

第二项指明窗口的窗口手柄(HWND),它与VCL窗口组件的Handle属性相关。

第三项括在大括号内的是窗口类类名,应用程序使用这个类名来注册窗口。通常是多个窗口共享一个类名。例如,通用按钮组件的类名为Button,同一时刻在不同应用程序中可能有几十个按钮,但它们是同一个窗口类。当应用程序为Delphi应用程序时,对于窗体和组件,WinSight在此处显示代表该组件的VCL类。对于一个按钮组件,WinSight显示的类名是TButton。如下图:

image

Note

在开发Delphi1时,Delphi是工程的代码名,而产品的名称打算取作AppBuilder。后来Delphi成了正式的产品名。用WinSight侦查Delphi IDE,会发现Delphi主窗口的类名为TAppBuilder。这也算是对这种说法的一个印证。如下图:

image

第四项是创建窗口过程的模块名,通常该模块是一个可执行程序。此处,模块名为Explorer.exe。某块后面是窗口的大小和位置,最后是窗口正文。对于重叠窗口,窗口正文是指出现在标题栏上的文字,对于其他窗口类型,窗口正文的含义随窗口类型的不同而不同。例如,按钮的窗口正文是指按钮上的文字。

Note

在应用程序中创建隐式窗口来完成具体任务,是商业应用程序的惯用做法。隐式窗口只在模块后显示“hidden”,由于窗口是隐藏的,因此既没有大小和位置信息,也没有任何窗口正文。如下图:

image

窗口树是分层的,树的顶层是Windows桌面,下一层是桌面的所有子窗口。例如,可执行文件就位于桌面节点下。每个桌面窗口也可以有自己的子窗口。父窗口、子窗口和同级窗口之间用连线联接。

image

看上图,树窗口中每个项的左边有一个菱形。若一个窗口有子窗口,则其左边的菱形中包含一个“+”号或“-”号;“+”号表示该节点是收缩节点,可将其扩展来显示子窗口;“-”号表示该节点已经扩展,其子窗口已经显示。可点击窗口树中项目左边任何部位来扩展或收缩节点。菱形为空时,辨识一个窗口无子窗口。

Note

如果窗口树中的某个窗口被启用,则每当该窗口接收一条发自Windows的消息时,其左边的菱形都会闪烁一下。

 

消息跟踪窗口(Message Trace Options)

消息跟踪窗口显示Windows产生的单条消息。消息跟踪项的典型形式如下:

image

000747:00290220 “h□□“ WM_KEYDOWN Dispatched 48h 72d VK_H  Scan 23h Down

没有必要详细分析其中的内容,因为随着消息的不同,其中的内容可以有很大差别。此处是一个Memo组件接收一条带参数VK_H的WM_KEYDOWN的消息,换句话说,就是当光标在Memo组件上时按下h键。正如大家所看到的,消息跟踪项中某些信息也出现在窗口树中,例如,窗口句柄和类名。

从主菜单选择【Start!】菜单项,就可以开始消息跟踪,窗口接收到的消息就会出现在消息跟踪窗口中。要终止消息跟踪,可从主菜单选【Stop!】菜单项。

Note

【Stop!】和【Start!】菜单项在主菜单的菜单条上占用同一个位置,当消息跟踪处于关闭状态的时候,该菜单项为【Start!】;当消息跟踪运行是,该菜单项为【Stop!】。

当消息跟踪窗口接收消息时,消息可以在窗口中滚动。用户可以终止消息跟踪,然后滚动查看消息跟踪窗口中的任何消息。另一个选项是将消息输出道一个日志文件。

WinSight使用户能查看发送到所有窗口的消息或发送到某个特定窗口的消息。要查看所有消息,从主菜单选【Message | All Windows】菜单项;虽然用户可以选择查看发送到所有窗口的全部消息,但这样做通常效率不高;因为窗口中的消息又多又复杂,用户难以查找想要的消息。

比较好的办法是选择一个具体窗口,监视该窗口接收的消息。这样做可以使消息跟踪窗口便于管理。要查看某个具体窗口的消息,可先在消息树中找到该窗口,在其上点击来选择它;然后从主菜单选择【Messages | Selected Windows】,再选【Start!】菜单项,任何发送到所选窗口的消息就会出现在消息跟踪窗口中。

Note

用户在使用WinSight时,最好是先想好要查看的内容。因为发送到单个窗口的消息很多,用户要查看的消息可能很快滚过屏幕。为了发挥WinSight的最大效益,用户可以选择要查看消息的窗口,启动消息跟踪,根据需要操作窗口,然后关闭消息跟踪。

 

消息跟踪选项

通过“Message Trace Options”对话框,用户能控制消息跟踪窗口中消息的显示,还可以改变消息显示方式。可从主菜单上选【Messages | Options】菜单项来调出Message Trace Options对话框,用户能控制消息跟踪窗口中消息的显示,还可以改变消息显示的方式。可从主菜单上选【Messages | Options】菜单项来调出Message Trace Options对话框。

image

对话框中标有Messages to Trace的区域是该对话框的主体,这个区域的左面有若干个消息组,右面是一个列表框,其中显示所有Windows消息。当用户选择或取消选择消息组时,列表中对应的消息将被选择或取消选择。

Note

列表中所有大写的消息都是标准Windows消息;小写消息时未记入文档的Windows消息;未记入文档的Windows消息由Windows内部使用,不出现在Windows API帮助文件中。

image

 

当选中All Messages复选框时,WinSight跟踪所有Windows消息。为了减少消息跟踪窗口的杂乱,用户可选择只查看某几个消息组。例如,用户只想查看鼠标消息,就可关闭All Messages复选框,而选中Mouse复选框。为了进一步明确要查明的消息,用户可关闭所有选项,然后从列表中选择一条具体消息。例如,如果用户只想查看WM_LBUTTONDOWN消息,就可关闭所有选项,然后从列表框中选取WM_LBUTTONDOWN消息,消息跟踪窗口就会只显示WM_LBUTTONDOWN消息。

Message Trace Options对话框上另一组选项控制消息跟踪窗口中消息的显示方式。如下图:

image

Interpret Values选项通知WinSight,将每条消息的参数分解成可读性更强的格式。例如,给定一条WM_KEYDOWN消息,用户在消息跟踪窗口中看到的显示如下:

image

如果勾选中Interpret Values选项,则会看到如下消息:

image

多数时候,大家还是比较喜欢更详细的显示,因此一般都选中Interpret Values选项。

Hex Values选项通知WinSight,以十六进制格式显示消息跟踪窗口中的值。当用户有一定的编程经验后,会发现这个选项在某些情况下很有用。Show Times选项的用处不大,它显示系统时间。

image

Log file选项使用户能将消息跟踪结果存储到磁盘上的文件中。当选中该选项时,消息仍然显示到消息跟踪窗口中。当用户需要对产生的消息做一个备份时,这个选项就很有用了。

image

Note

创建日志文件有另外一个好处:创建好一个日志文件后,可将它用文本编辑器打开,然后用文本编辑器自带的查找功能进行查看,查看具体的消息或消息参数。

 

其他WinSight特性(Other WinSight Features)

WinSight还有一些其他特性,利用这些特性,可使窗口的侦查更灵活方便。

1)、查看窗口细节

WinSight的Detail特性显示某个特定窗口的全部有关细节。要详细查看一个窗口,在窗口树中选取该窗口,然后从主菜单选择【Spy | Open Detail】菜单项,也可以双击窗口树中的窗口或按Enter键。如下图显示的是Windows资源管理器的细节。

image

正如大家所看到的,Detail窗口显示大量所查看窗口的信息。

2)、Follow Focus

本选项使用户能选择应用程序中的一个窗口,并使它成为窗口树中的活动窗口。窗口树通常都包含有几十个窗口,要在其中找到要查看的窗口的确不是件容易的事,因此,Follow Focus确实能给用户带来方便。

要使用这一特性,从主菜单选【Spy | Follow Focus】菜单项,然后,切换到包含要侦查窗口的应用程序,并点击窗口上用户想要侦查的某个具体控件(如果需要的话);WinSight自动地在窗口树中选取该窗口。从主菜单上选择【Start!】菜单项,就可开始窗口侦查。

Tip

一旦打开【Follow Focus】选项,它就会一直开着,直至用户将它关闭。当用户在应用程序中找到要侦查的窗口后,如果不再查看程序中的其他窗口或控件,就应该立刻关闭Follow Focus选项。

3)、Find Window(查找窗口)

WinSight的Find Window特性与Follow Focus正好相反:在窗口树中,找到当前要查看的窗口,然后从主菜单选择【Spy | Find Window】菜单项,WinSight就会显示一个环绕该窗口的粗边框,并闪烁该边框。

image

点击该窗口,或从窗口树中选择另外一个窗口,粗边框就会消失。粗边框总是显示在所有的窗口之上,因而用户可以找到屏幕上的任意一个窗口,即使该窗口隐藏在其他窗口之下。用Find Window找到的窗口不升到最上面,也不得到输入焦点,它只是被标识出来。

Note

Find Window不能查找隐式窗口或被极小化的窗口。

输入焦点(focus)一离开窗口树,Find Window模式就会关闭。如果在另外一个应用程序上点击,或在WinSight中其他位置点击,Find Window模式也会关闭。

4)、Switch To(切换到)

Switch To特性使用户能切换到应用程序中某个特定窗口。要切换到某个窗口,只需在窗口树中选取该窗口,然后从主菜单上选择【Spy | Switch To】菜单项,该窗口就会出现在屏幕的最上面,并具有输入焦点。如果窗口是极小化窗口,则它将恢复到以前的位置。Switch To对隐式窗口不起作用。

 

要理解WinSight中每一条消息和租用,不是一朝一夕的事情,大家要花一定的事件来实际使用WinSight,从而最终掌握它。

posted on 2012-06-11 22:22  pchmonster  阅读(5222)  评论(2编辑  收藏  举报

导航