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

全部博文(206)

文章存档

2013年(13)

2012年(8)

2011年(33)

2010年(152)

我的朋友

分类:

2010-10-02 00:55:54

 在测试程序运行过程中,经常会出现一些异常窗口:如错误窗口、文件下载窗口、警告窗口、以及一些其它的错误窗口。出现这种窗口应该在记录log 之后, 将其关闭。

1:关闭错误窗口

  本章要用到一个 API 函数 EnumWindows()。在第二章中我们谈到自动关闭程序时用到了这个函数。

  部分代码段如下:

// 数据结构定义
 typedef struct 
 {
   HWND hWnd;
   char cWinBuf[256];
 }WINLIST;
 WINLIST gWinList[256];
 int giCountWin,j;

 typedef struct
 {
   char cCloseList[100];
 }CLOSELIST;
 CLOSELIST gCloseList[30];
 int giCountClose; 

 ……
 // EnumWindows函数的回调函数。列举所有的窗口标题
 BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM lParam )
 {
   char buffer[256];
   GetWindowText(hWnd, buffer, 256);
   if ( strlen(buffer) )
   {
     if (giCountWin < 256)
     {
       gWinList[ giCountWin].hWnd = hWnd;
       strcpy(gWinList[ giCountWin].cWinBuf,buffer);
       giCountWin ++;
     }
   }
   return TRUE;
 }


  // 关闭错误窗口
 BOOL CloseErrorWindow()
 {
   short i=0,j=0;

   if ( giCountClose > 0 )// giCountClose表示要关闭的错误窗口总数
   {
     giCountWin = 0; // giCountWind表示windows列举窗口的总数
     EnumWindows( (WNDENUMPROC)EnumWindowsProc,0);
     for( i = 0; i < giCountClose; i++)
     {
       for ( j = 0; j < giCountWin; j++) // 判断是否为错误窗口。
         if ( strcmp(gWinList[j].cWinBuf,gCloseList[i].cCloseList) == 0 )
         {
           PostMessage( gWinList[j].hWnd, WM_CLOSE,0,0);
           PostMessage( gWinList[j].hWnd, WM_QUIT,0,0);
         }
     }
   }
   return TRUE;
 }
  一些说明:

  结构CLOSELIST数组 gCloseList[30] 存储了所有错误窗口的名称(最多30个)。这些数据存储在一个文本文件中,每行存储一个错误窗口的名称。程序启动时读入此变量。giCountClose表示所有错误窗口的总数。

  例如gCloseList可能的值如下:

 giCountClose : 6
 gCloseList[0].cCloseList : 错误
 gCloseList[1].cCloseList : 警告
 gCloseList[2].cCloseList : 安全
 gCloseList[3].cCloseList : 程序遇到了一个致命错误
  CloseErrorWindow()函数可放在计时器事件中,每隔五秒钟左右的时间执行一次。

第二部分:关闭错误程序:

  部分代码段如下:

 void CloseMyWindow()
 {
   short j=0, sFirst = 0;

   giCloseIETime = 0;
   gMAX_CLOSEIE_TIME = RAND( sCloseMin, sCloseMax );
   giCountWin = 0;
   EnumWindows( (WNDENUMPROC)EnumWindowsProc,0); // 列举所有窗口
   for ( j = 0; j

        sFirst = 1;     }   } }

  说明:

  1. IsMyWindow() 是我自定义的一个函数,用来判断当前窗口的标题中是否包含了要模拟主程序的窗口文字. 例如:"统计程序", "Microsoft Internet Explorer", 若包含了,则认为这是模拟主程序的窗口,则返回TRUE,否则返回FALSE。 函数的代码没有在这里列出。

  2. sFirst 用来控制测试网页程序时,保证有一个IE窗口不被关闭。若无这个变量控制,则所有的IE窗口都被关闭。

  3. CloseMyWindow()函数可放在计进器事件中,每隔一段时间执行一次。
阅读(1344) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~