Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4737087
  • 博文数量: 206
  • 博客积分: 5240
  • 博客等级: 大校
  • 技术积分: 3224
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 21:40
文章分类

全部博文(206)

文章存档

2013年(13)

2012年(8)

2011年(33)

2010年(152)

我的朋友

分类:

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 将自己的程序插入到对方进程等。另外,模拟程序和测试程序的随机化程度、数据样本的分布性,也很有讲究。

阅读(1460) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~