一、 程序设计思路与实现首先要分析一下广告窗口的一般特性。广告窗口一般是通过主页面里的Javascript脚本或VBScript 脚本语言来动态弹出的,其实质还是一个IE窗口。但绝大多数窗口在创建出来后是没有菜单,工具条等其它东西的,因此我们可以先搜寻IE窗口,然后判断其窗口是否有菜单和工具条等东西,如果没有就认为是广告窗口了,虽然这样的判断不是十分的严格,但从实际使用情况来看虽然有时会误关一些正常窗口,但发生的几率是相当小的。完全可以忽略。而且这种情况多发生在聊天室中,所以只需在聊天之前将其关闭,只在浏览网页的时候运行程序就一般不会发生误操作了。
程序的实现并不复杂,由于程序运行起来后任意时刻弹出的广告窗体都要随时关闭,所以就应当通过设置定时器,每隔一段时间就搜寻以下当前是否有广告窗口,如果有就将其关闭,否则继续监视。因此可以在程序的初始化入口函数中用SetTimer()函数启动定时器。下面就结合实际代码对部分关键代码进行讲解:从第一个窗口开始对每一个窗口进行枚举搜索,如果第一个窗口存在那么就可以通过在while循环里的GetWindow(GW_HWNDNEXT);来搜寻下一个窗口,并在其内判断是否是广告窗体,直至搜寻完最后一个窗体为止:
CWnd* pMainWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST); while (pMainWnd) { …… pMainWnd = pMainWnd->GetWindow(GW_HWNDNEXT); } |
CString strClassName; GetClassName(pMainWnd->m_hWnd,strClassName.GetBufferSetLength(100),100); |
//根据句柄获取子窗口指针 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)); |
if(pChildNextWnd) { if(!(GetWindowLong(pChildWnd->m_hWnd,GWL_STYLE)&WS_VISIBLE)) { pTempWnd=NULL; pTempWnd=pMainWnd; //关闭广告窗口 …… return; } } |