分类:
2010-10-02 00:57:00
由于各种各样的原因,测试的目标程序, 经过一段时间后可能出现故障停止运行。这时,我们的软件应该能够检测到这一现象,若累计达到一定时间(如五分钟),则应该记录错误发出警告, 并将程序关闭重启。
那么,如果检测程序的异常状态呢?下面讲述我摸索出来的几个原理:
大多数程序出现异常时,会弹出一个错误窗口,这样就可以用前面所说的 EnunWindow 的方式,来判断是否状态改变。另外,有一些程序,状态发生改变之后,会在界面上反映出来。例如,QQ 成功登录之后,是一个金色的企鹅图标;如果没有登录成功,则是灰色的。这样的话,我们可以通过程序获取其界面上的某点,分析其RGB值,若为金色,则判断程序在登录状态。否,则在注销状态。
我们要用到如下两个API函数:
CreateDC The CreateDC function creates a device context (DC) for a device using the specified name. HDC CreateDC( LPCTSTR lpszDriver, // driver name LPCTSTR lpszDevice, // device name LPCTSTR lpszOutput, // not used; should be NULL CONST DEVMODE* lpInitData // optional printer data ); GetPixel The GetPixel function retrieves the red, green, blue (RGB) color value of the pixel at the specified coordinates. COLORREF GetPixel( HDC hdc, // handle to DC int nXPos, // x-coordinate of pixel int nYPos // y-coordinate of pixel );CreateDC用来建立一个设备场景。GetPixel用来获取设备场景中某逻辑坐标的RGB值。
我的部分程序如下:
COLORREF CaptureRGB( ) { HDC hScreenDC; COLORREF color; hScreenDC = CreateDC("DISPLAY",NULL,NULL,NULL); color = GetPixel(hScreenDC,18,682); return color; } void CheckState() { COLORREF Colors; short j=0; Colors = CaptureRGB(); if ( Colors == 0x0000FF ) { // 假定 绿色 是一种状态,在此处理 } else { // 非绿色的处理 } }函数CaptureRGB()用来获取屏幕上某点的RGB值。为了简单起见,此处座标为一常数坐标(18,682)。在程序中,应该通过设定来获取坐标值。
在函数中,用 if ( Colors == 0x0000ff) 来判断获取的颜色是否为指定的颜色。0x0000ff 是绿色的rgb值。
前面几章只是讲了一些最基本的窗口模拟技术。实际上,熟悉了 Windows SDK 的工作方式之后,要实现一个这样的模拟程序并不困难。 当然,也有许多较为深入点的应用技术没有谈到,例如:模拟程序要能够读取到目标程序的采生的数据,这需要了解如何在不同进程之间共享数据,了解如何使用 HOOK 将自己的程序插入到对方进程等。另外,模拟程序和测试程序的随机化程度、数据样本的分布性,也很有讲究。