首页 随笔 乐走天涯 程序资料 评论中心 Tag 论坛 其他资源 搜索 消息中心 联系我 关于 RSS

第5节 窗口处理: 遍历窗口, 关闭错误窗口


日期: 2000-07-18 14:00 | 联系我 | 关注我: SteemIT, Twitter, Google+

  在测试程序运行过程中,经常会出现一些异常窗口:如错误窗口、文件下载窗口、警告窗口、以及一些其它的错误窗口。出现这种窗口应该在记录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()函数可放在计进器事件中,每隔一段时间执行一次。


 文章评论
目前没有任何评论.

↓ 快抢占第1楼,发表你的评论和意见 ↓

发表你的评论
如果你想针对此文发表评论, 请填写下列表单:
姓名: * 必填 (Twitter 用户可输入以 @ 开头的用户名, Steemit 用户可输入 @@ 开头的用户名)
E-mail: 可选 (不会被公开。如果我回复了你的评论,你将会收到邮件通知)
网站 / Blog: 可选
反垃圾广告: 为了防止广告机器人自动发贴, 请计算下列表达式的值:
3 x 2 + 4 = * 必填
评论内容:
* 必填
你可以使用下列标签修饰文字:
[b] 文字 [/b]: 加粗文字
[quote] 文字 [/quote]: 引用文字

 
首页 随笔 乐走天涯 猎户星 Google Earth 程序资料 程序生活 评论 Tag 论坛 资源 搜索 联系 关于 隐私声明 版权声明 订阅邮件

程序员小辉 建站于 1997 ◇ 做一名最好的开发者是我不变的理想。
Copyright © XiaoHui.com; 保留所有权利。