职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 1660|回复: 5

应用实例:VC++实现广告窗口自动关闭

[复制链接]
yoyo 发表于 2007-7-8 11:27 | 显示全部楼层 |阅读模式
一、 引言

  我们在上网浏览时,有时访问到某些网站的网页时会自动弹出一些广告窗口,甚至有不少个人主页为了利用网络广告来赚钱一下同时弹出几个甚至十几个广告窗口。这些窗口一个一个的关掉十分麻烦,而且如果不关的话又会占用大量的系统资源,所以不少人对此深恶痛绝,作为程序员可以利用自身技术优势根据自己的实际需要编制一些很适合自己的小工具。因此本文就对如何通过软件编程来实现对广告窗口的自动关闭进行介绍,以期能起到抛砖引玉之效。

  二、 程序设计思路与实现

  首先要分析一下广告窗口的一般特性。广告窗口一般是通过主页面里的Javascript脚本或VBScript 脚本语言来动态弹出的,其实质还是一个IE窗口。但绝大多数窗口在创建出来后是没有菜单,工具条等其它东西的,因此我们可以先搜寻IE窗口,然后判断其窗口是否有菜单和工具条等东西,如果没有就认为是广告窗口了,虽然这样的判断不是十分的严格,但从实际使用情况来看虽然有时会误关一些正常窗口,但发生的几率是相当小的。完全可以忽略。而且这种情况多发生在聊天室中,所以只需在聊天之前将其关闭,只在浏览网页的时候运行程序就一般不会发生误操作了。

  程序的实现并不复杂,由于程序运行起来后任意时刻弹出的广告窗体都要随时关闭,所以就应当通过设置定时器,每隔一段时间就搜寻以下当前是否有广告窗口,如果有就将其关闭,否则继续监视。因此可以在程序的初始化入口函数中用SetTimer()函数启动定时器。下面就结合实际代码对部分关键代码进行讲解:

  从第一个窗口开始对每一个窗口进行枚举搜索,如果第一个窗口存在那么就可以通过在while循环里的GetWindow(GW_HWNDNEXT);来搜寻下一个窗口,并在其内判断是否是广告窗体,直至搜寻完最后一个窗体为止:
  1. CWnd* pMainWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);
  2. while (pMainWnd)
  3. {
  4.  ……
  5.  pMainWnd = pMainWnd->GetWindow(GW_HWNDNEXT);
  6. }
复制代码
  对于判断是否是广告窗口,可以用GetClassName()函数获取窗口类型来判断是否是IE窗口:
  1. CString strClassName;
  2. GetClassName(pMainWnd->m_hWnd,strClassName.GetBufferSetLength(100),100);
复制代码
对于那些不是IE类型的窗体根本不用加以考虑,可以将刚才得到的strClassName窗口类型同\"IEFrame\"进行比较来进行判断,如果是IE窗口才可以进行下一步的判断:

//根据句柄获取子窗口指针
  1. CWnd* pChildWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,NULL,"Worker",NULL));
  2. if(!pChildWnd)
  3.  pChildWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,NULL,"WorkerA",NULL));
复制代码
  如果子窗口存在,用类似的方法获取下一个子窗口指针:
  1. CWnd* pChildNextWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,pChildWnd->m_hWnd,"Worker",NULL));
  2. if(!pChildNextWnd)
  3. pChildNextWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,pChildWnd->m_hWnd,"WorkerA",NULL));
复制代码
  如果该窗口存在,那么下步只要验证当前窗口可视就可以断定其的确属于广告窗口,可以通过GetWindowLong()获取到当前的窗口风格,然后通过逻辑运算可以判断出当前窗口是否具有WS_VISIBLE可视效果:
  1. if(pChildNextWnd)
  2. {
  3.  if(!(GetWindowLong(pChildWnd->m_hWnd,GWL_STYLE)&WS_VISIBLE))
  4.  {
  5.   pTempWnd=NULL;
  6.   pTempWnd=pMainWnd;
  7.   //关闭广告窗口
  8.   ……
  9.   return;
  10.  }
  11. }
复制代码
  现在已经可以准确判断出哪个是广告窗口了,只需将其关闭即可,前段代码已经将我们想关闭的窗口指针保存到变量pTempWnd中,因此我们可以通过简单的向其发送WM_CLOSE消息就可以彻底将其关闭了:
  1. pTempWnd->PostMessage(WM_CLOSE,0,0);
复制代码
  三、 小结

  本文仅对于关闭广告窗口的核心代码作了介绍,在实际编程中需要考虑到许多实际的因素,比如为了节省屏幕占用空间,最好将其做成系统托盘模式;由于需要长期驻留内存所以要尽量把程序大小控制好,并且采用Release发行版本等等。本文所述内容有一定的通用性,可以将其用于监视某项进程,当该进程启动后由程序来触发某个事件来对其进行处理等等。
木已 发表于 2011-8-5 11:39 | 显示全部楼层
你还想说什么啊....
北大青鸟 发表于 2011-8-7 11:07 | 显示全部楼层
挺好啊!!!!!!!!!!!!!!!
能文能武 发表于 2011-8-10 10:38 | 显示全部楼层
给我点愤怒.
醉倚西风 发表于 2011-8-12 09:59 | 显示全部楼层
朕要午休了..............
走就走吧 发表于 2011-8-18 13:31 | 显示全部楼层
搞笑..哈哈.
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-3-29 13:07 , Processed in 0.141420 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表