-
三月 25
上网的时候经常会遇到一些网站的弹出窗口,这些大部分都是广告,不仅影响了载入速度而且对于浏览也造成了一些影响,有些高级的浏览器会自带一些屏蔽广告的插件,其实屏蔽这些广告也是比较容易的,我们用vc来简单实现一下!
鉴于大部分的弹出广告其实是一个IEFrame形式,我们可以用一个API函数FindWindowEx来查找这些广告的句柄,找到句柄后我们可以发送一个WM_CLOSE的消息就可以实现关闭,注意的是,对于网页中的一些浮动广告该方法不是相当有效。
FindwindowEx是FindWindow的一个扩展函数,支持4个参数,原型如下:
HWND FindWindowEx( HWND hwndParent, // handle to parent window HWND hwndChildAfter, // handle to a child window LPCTSTR lpszClass, // pointer to class name LPCTSTR lpszWindow // pointer to window name );
可以看出,这个函数不仅可以查找当前窗口,甚至可以查找子窗口,这个的确比FindWindow强多了,由于很多弹出窗口具有child属性,因此用这个函数是很有必要的.下面对关键代码做一个详细注释,你可以把下面代码放在一个事件中,最好是放在OnTimer事件中,用定时器来不断监视:
CWnd* pMainWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST); //用Cwnd的一个成员函数GetWindow来获取一个窗口,GW_HWNDFIRST 表示该窗口是否处于顶层,因为一般的广告都是处于顶层的 while (pMainWnd) { CString strClassName;//保存类名的变量 GetClassName(pMainWnd->m_hWnd,strClassName.GetBufferSetLength(100),100); //设置缓冲区 if(strClassName=="IEFrame")//判断类名是否等于IEframe { CWnd* pChildWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,NULL, "Worker",NULL));//哈哈,轮到FindWindowEx出场了 if(!pChildWnd) pChildWnd=CWnd::FromHandle(FindWindowEx(pMainWnd->m_hWnd,NULL, "WorkerA",NULL)); if(pChildWnd)//如果属于child窗口那么... { 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)//以上都是查找child窗口,注意第三个参数 { if(!(GetWindowLong(pChildWnd->m_hWnd,GWL_STYLE)&WS_VISIBLE)) {//这里是判断弹出窗口是否可见,也就是说是否具有WS_VISIBLE属性 pTempWnd=NULL; pTempWnd=pMainWnd; return; } } } } pMainWnd = pMainWnd->GetWindow(GW_HWNDNEXT); } } else { pTempWnd->PostMessage(WM_CLOSE,0,0);//post一个WM_close的消息关闭 }
通过以上部分代码,我们就可以关闭大部分的弹出广告了,这里主要运用的技术是FindWindowEx来查找child窗口的句柄,大家可以自己完善一下!
后一篇:初学C#之打造气泡屏幕保护
前一篇:批处理快速设置本机IP
- 评论(0)
发表评论 TrackBack
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。