C++ 黑客编程揭秘与防范(第3版)
上QQ阅读APP看书,第一时间看更新

1.1.3 如何获取窗口的类名称

编写程序调用FindWindow()函数的时候,通常会使用其第2个参数,也就是窗口的标题。但是有些软件的窗口标题会根据不同的情况进行改变,那么程序中就不能在FindWindow()函数中直接通过窗口的标题来获得窗口的句柄了。而窗口的类名通常是不会变的,因此编程时可以指定窗口类名来调用FindWindow()函数以便获取窗口句柄。那么,如何能获取到窗口的类名称呢?这就是将要介绍的第1个开发辅助工具—Spy++。

Spy++是微软Visual Studio中提供的一个非常实用的小工具,它可以显示系统的进程、窗口等之间的关系,可以提供窗口的各种信息,可以对系统指定的窗口进行消息的监控等。它的功能非常多,这里演示如何用它来获取窗口的类名称。

打开“开始”菜单,在Visual Studio的菜单路径下找到Spy++,打开Spy++窗口,如图1-2所示。

图1-2 “Microsoft Spy++”窗口

选择工具栏中的“Find Window”按钮,如图1-3所示。

图1-3 “Find Window”按钮

单击“Find Window”按钮,出现如图1-4所示的窗口。

图1-4 Find Window窗口

在图1-4中,用鼠标左键单击“Finder Tool”后面的图标,然后拖曳到指定的窗口上,会显示出“Handle”(窗口句柄)“Caption”(窗口标题)和“Class”(窗口类名),其中“Class”是编程时要使用的“窗口类”名称。

“Hide Spy++”是一个比较实用的功能,它用来隐藏Spy++主窗口界面。选中该复选框后,拖曳“Finder Tool”后的图标时,图1-2所示为窗口将被隐藏。这个功能的实用之处在于,有些应用软件有反Spy++的功能,隐藏Spy++主窗口有助于避免被反Spy++的软件检测到。为什么隐藏Spy++的“Find Window”窗口会有反检测的功能,反检测的原理是什么?原理很简单,目标程序也是通过调用FindWindow()函数来查找Spy++窗口的,如果有该窗口,就进行一些相应的处理。

:通过Spy++找到的窗口句柄是不能在编程中使用的,每次打开窗口时,窗口的句柄都会改变。

将“Finder Tool”后的图标拖曳到记事本的标题处,Spy++的Find Window窗口显示的内容如图1-5所示。

图1-5 获取到信息的Find Window窗口

从图1-5中可以得到记事本程序的标题和类名称。当编写程序调用FindWindow()函数,不能通过程序的标题文本得到窗口的句柄时,可以通过窗口类名称得到窗口的句柄。