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

原创 2007年09月28日 11:02:00
 一、 引言

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

  二、 程序设计思路与实现

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

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

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

CWnd* pMainWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);
while (pMainWnd)
{
 ……
 pMainWnd = pMainWnd->GetWindow(GW_HWNDNEXT);
}

  对于判断是否是广告窗口,可以用GetClassName()函数获取窗口类型来判断是否是IE窗口:

CString strClassName;
GetClassName(pMainWnd->m_hWnd,strClassName.GetBufferSetLength(100),100);

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

//根据句柄获取子窗口指针
CWnd* pChildWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,NULL,"Worker",NULL));
if(!pChildWnd)
 pChildWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,NULL,"WorkerA",NULL));

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

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可视效果:

if(pChildNextWnd)
{
 if(!(GetWindowLong(pChildWnd->m_hWnd,GWL_STYLE)&WS_VISIBLE))
 {
  pTempWnd=NULL;
  pTempWnd=pMainWnd;
  //关闭广告窗口
  ……
  return;
 }
}

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

pTempWnd->PostMessage(WM_CLOSE,0,0);

  三、 小结

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

VC++自释放指针、自释放虚拟内存、自关闭句柄、局部作用域回调函数调用等辅助开发类

VC++自释放指针、自释放虚拟内存、自关闭句柄、局部作用域回调函数调用等辅助开发类...
  • sdhongjun
  • sdhongjun
  • 2014年12月21日 10:15
  • 1933

VC控件随窗口最大化而变大或缩小

1.本对话框实现所有控件随窗口最大化或恢复原状:
  • lsyyoyo
  • lsyyoyo
  • 2014年11月16日 23:49
  • 1731

Python实现定时自动关闭的tkinter窗口

功能简要说明:程序运行后10秒钟自动关闭。 技术要点:tkinter应用程序的destroy()方法,多线程编程。 代码截图: 运行效果: ----------...
  • oh5W6HinUg43JvRhhB
  • oh5W6HinUg43JvRhhB
  • 2017年11月19日 00:00
  • 562

【C#/WPF】窗体定时自动关闭

使用DispatcherTimer
  • qq_18995513
  • qq_18995513
  • 2017年02月22日 15:12
  • 1555

JavaScript自动关闭窗口

JavaScript自动关闭窗口                window.onload = function () {alert('打开页面自动弹出框!')...
  • hww9011
  • hww9011
  • 2014年11月24日 21:32
  • 456

窗口自动关闭

在一个对话框上单击按钮,然后弹出一个对话框,在这个对话框上做一些工作,完成之后弹出来的对话框自动关毕。...
  • liangjisheng
  • liangjisheng
  • 2017年05月20日 08:27
  • 127

Qt浅谈之二十App自动重启及关闭子窗口

一、简介        简介 二、运行图 (1)如下图1所示。 三、详解 1、开始 (1)开始 四、总结 (1)本博文只发布部分源码,读者可根据思路来进行定制。 (2)在不同的系统下可能还...
  • taiyang1987912
  • taiyang1987912
  • 2014年09月04日 22:06
  • 6300

可自动关闭的JS消息提示框

JavaScript自动关闭窗口       //自动关闭提示框   function Alert(str) {       var msgw,msgh,bordercolor...
  • fmwind
  • fmwind
  • 2015年11月19日 11:48
  • 1871

VC++工作者线程关闭的问题

在使用MFC做一个activex小控件时引入了多线程,我使用的工作者线程,主体功能没有问题,但是退出IE浏览器里总是发生崩溃的问题,仔细跟了一下,发现是内存有泄露,其他的好都好说,new完后,记得de...
  • atrueman123
  • atrueman123
  • 2015年04月12日 12:55
  • 1007

xshell 网络断开后 tab页自动关闭 的解决办法

Xshell ,当网络断开后,打开的 tab页会自动都关闭,且输入的命令 都会消失,导致之前的历史工作 都无法看到。 造成非常大的不便。 经过多番研究,询问到某一个同事,他说他的xshe...
  • dandaoyi
  • dandaoyi
  • 2016年10月10日 21:43
  • 1195
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC++编程实现广告窗口自动关闭
举报原因:
原因补充:

(最多只允许输入30个字)