小辉程序员之路, since 1996 http://www.xiaohui.com
乐走天涯: 工作并快乐着,职业并休闲着
 » 首页 > WinAPI 应用: 自动测试/模拟程序的技术实现

第6节 获取桌面 RGB 颜色


http://www.XiaoHui.com 日期: 2000-07-25 14: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值。

Tags: VC++ 源码 | WINAPI | RGB



 文章评论

没有任何评论.
 
发表你的评论
如果你想针对此文发表评论, 请填写下列表单:
姓名: * 必填
E-mail: 可选 (不会被公开)
反垃圾广告: 为了防止广告机器人自动发贴, 请计算下列表达式的值:
3 + 17 = * 必填
评论内容:
* 必填
你可以使用下列标签修饰文字:
[b] 文字 [/b]: 加粗文字
[quote] 文字 [/quote]: 引用文字

 

小辉程序员之路 建站于 1997 ◇ 做一名最好的开发者是我不变的理想……
Copyright(C) 1997-2008 XiaoHui.com   All rights reserved
声明:站内所有原创文字,未经许可,均可转载、复制。
转载时必须以链接形式注明作者和原始出处