VC++编程实现广告窗口自动关闭

2016-02-19 13:57 9 1 收藏

今天图老师小编要跟大家分享VC++编程实现广告窗口自动关闭,精心挑选的过程简单易学,喜欢的朋友一起来学习吧!

【 tulaoshi.com - 编程语言 】

一、 引言

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

二、 程序设计思路与实现

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

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

   从第一个窗口开始对每一个窗口进行枚举搜索,如果第一个窗口存在那么就可以通过在while循环里的GetWindow(GW_HWNDNEXT);来搜寻下一个窗口,并在其内判断是否是广告窗体,直至搜寻完最后一个窗体为止:

CODE:
?tid=567977&extra=page%3D2%26filter%3Ddigest#"[Copy to clipboard]
CWnd* pMainWnd = AfxGetMainWnd()-GetWindow(GW_HWNDFIRST);
while (pMainWnd)
{
  ……
  pMainWnd = pMainWnd-GetWindow(GW_HWNDNEXT);
}
   对于判断是否是广告窗口,可以用GetClassName()函数获取窗口类型来判断是否是IE窗口:

CODE:
?tid=567977&extra=page%3D2%26filter%3Ddigest#"[Copy to clipboard]
CString strClassName;
GetClassName(pMainWnd-m_hWnd,strClassName.GetBufferSetLength(100),100); 

   对于那些不是IE类型的窗体根本不用加以考虑,可以将刚才得到的strClassName窗口类型同"IEFrame"进行比较来进行判断,如果是IE窗口才可以进行下一步的判断:

CODE:
?tid=567977&extra=page%3D2%26filter%3Ddigest#"[Copy to clipboard]
//根据句柄获取子窗口指针
CWnd* pChildWnd=CWnd::FromHandle(FindWindowEx(pMainWnd-m_hWnd,NULL,"Worker",NULL));
if(!pChildWnd)
  pChildWnd=CWnd::FromHandle(FindWindowEx(pMainWnd-m_hWnd,NULL,"WorkerA",NULL)); 

   如果子窗口存在,用类似的方法获取下一个子窗口指针:

CODE:
?tid=567977&extra=page%3D2%26filter%3Ddigest#"[Copy to clipboard]
CWnd* pChildNextWnd=CWnd::FromHandle(FindWindowEx(pMainWnd-m_hWnd,pChildWnd-m_hWnd,"Worker",NULL));
if(!pChildNextWnd)
pChildNextWnd=CWnd::FromHandle(FindWindowEx(pMainWnd-m_hWnd,pChildWnd-m_hWnd,"WorkerA",NULL)); 
   如果该窗口存在,那么下步只要验证当前窗口可视就可以断定其的确属于广告窗口,可以通过GetWindowLong()获取到当前的窗口风格,然后通过逻辑运算可以判断出当前窗口是否具有WS_VISIBLE可视效果:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)


CODE:
?tid=567977&extra=page%3D2%26filter%3Ddigest#"[Copy to clipboard]
if(pChildNextWnd)
{
  if(!(GetWindowLong(pChildWnd-m_hWnd,GWL_STYLE)&WS_VISIBLE))
  {
   pTempWnd=NULL;
   pTempWnd=pMainWnd;
   //关闭广告窗口
   ……
   return;
  }

   现在已经可以准确判断出哪个是广告窗口了,只需将其关闭即可,前段代码已经将我们想关闭的窗口指针保存到变量pTempWnd中,因此我们可以通过简单的向其发送WM_CLOSE消息就可以彻底将其关闭了:

CODE:
?tid=567977&extra=page%3D2%26filter%3Ddigest#"[Copy to clipboard]
pTempWnd-PostMessage(WM_CLOSE,0,0); 

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

三、 小结

   本文仅对于关闭广告窗口的核心代码作了介绍,在实际编程中需要考虑到许多实际的因素,比如为了节省屏幕占用空间,最好将其做成系统托盘模式;由于需要长期驻留内存所以要尽量把程序大小控制好,并且采用 Release 发行版本等等。本文所述内容有一定的通用性,可以将其用于监视某项进程,当该进程启动后由程序来触发某个事件来对其进行处理等等。

来源:http://www.tulaoshi.com/n/20160219/1605762.html

延伸阅读
VC++中轻松实现滑动控件 作者: 上海同济大学计算机系 小鹰 下载本文示例代码 滑动控件是Windows中最常用的控件之一。一般而言它是由一个滑动条,一个滑块和可选的刻度组成,用户可以通过移动滑块在相应的控件中显示对应的值。通常,在滑动控件附近一定有标签控件或编辑框控件,用...
在Office2000中,就用户界面丰富程度而论,Word以56个工具栏(Toolbar)、50个弹出式菜单(Popup Menu)雄居首位,但Excel(工具栏40个、弹出式菜单51个)和PowerPoint(工具栏43个、弹出式菜单25个)也相差不远。大多数用户可能从来没有见过所有这些工具栏,甚至许多用户不知道Office提供了这么多命令工具。 虽然我们可以用菜单隐藏...
一、引用 当用户需要同时对文当的不同部分进行编辑时,常常会用到切分窗口;这些窗口可以都是相同的视,或者一个窗口为列表视,而另一个为树型视图。应用程序框架有多种方式来表示多视图,切分窗口是其中的方式之一。 切分窗口分为动态切分窗口和静态切分窗口,它们都是由CsplitterWnd类(MFC类库)来实现的,在这两种表示方式中,...
近日由于在华为培训,期间因为导师们忙得要紧,没那么多时间去教导我们,只是给我们看文档和代码,看完了,没事就想出这个来玩玩了。这里要先用SPY++来找到QQ登陆框的各个窗口标题或ID号。 原理:其实不难,只要找到QQ登陆框的号码输入和密码输入框,然后向其填数据就是了。 这里填数据就是向其发送消息,模拟键盘 罢了。 ...
一、函数调用捆绑   1、定义 捆绑:把函数体与函数调用相联系称为捆绑。当捆绑在程序运行之前(由编译器和连接器)完成时,称为早捆绑。(C编译只有一种函数调用,就是早捆绑)如果捆绑发生在运行时,则称为晚捆绑(或动态捆绑、运行时捆绑。 虚函数:如果我们在定义基类时在函数前加关键字virtual,则会告诉编译器对于此函数...

经验教程

321

收藏

11
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部