怪不得我的问题没人回答,原来忘了给分.还是关于怎样判断哪些窗口是IE的弹出窗口.(300分)

  • 主题发起人 主题发起人 www
  • 开始时间 开始时间
W

www

Unregistered / Unconfirmed
GUEST, unregistred user!
进来对Kill IE的弹出式广告比较感兴趣,想研究一下.但是我怎么才能知道这个窗口是
IE弹出(即javascript的open)的呢?
我可以截获IE的onbeforenavigate,onnewwindow2等事件,但怎么弹出的窗口的特征是什么呢?



 
关注,我也在研究
 
看函数名还有用 GetLastActivePopup(IE_hwnd); 不过我没试过!
 
多谢dhycq, 不过这样肯定是满足不了要求的.
因为等这个函数可用时窗口必须已经弹出了,我想在窗口未弹出之前截获,并且Cancel掉.
 
过滤IE的弹出式广告窗口、
过滤自编IE内核浏览器的弹出窗口
  我痛恨某些网站强制性弹出的广告窗口,比如王易的域名...狐翼的免费空间....
  然后面对着这些没玩没了的弹出式窗口往往是捶胸蹲足.....我一边安抚着可怜的内存一边开始了思考....

  终于有一天我想出了比较完美的办法:

  利用OnDownloadBegin和OnDownloadComplete

  以CHtmlView为例,弹出的广告窗口都是通过CHtmlView::OnNewWindow2( LPDISPATCH* ppDisp, BOOL* Cancel );打开的。

  关于OnNewWindow2不想多说,只说说这第2个参数 BOOL* Cancel

  当Cancel = false的时候就不能打开新窗口了,如果你的CHtmlView的该参数一直为FALSE那么一切弹出窗口都不能打开,广告窗口自然就没了。 那~~~要是总FALSE岂不是正常网页也无法浏览了?

  别忙,接下来要做的就是在适当的时候让这个参数返回FALSE。

  抛开CHtmlView我们回头来看看IE下载网页弹出广告窗口的过程:

  OnDownloadBegin ---->发现window.open等Js或者vbs ---->OnNewWindow2 ---->OnDownloadComplete

  了解了上述过程之后......什么时候让OnNewWindow2的第2个参数为FALSE你就清楚了吧!

  下面跟我实战。

  给你的从CHtmlView派生而来的CNoPopHtmlView加一个成员变量BOOL m_bPop;

  在构造函数里给m_bPop初始化为:m_bPop = TRUE;

  重载OnDownloadBegin虚函数,在其中加入:m_bPop = FALSE;

  重载OnDownloadComplete虚函数,在其中加入:m_bPop = TRUE;

  重载OnNewWindow2虚函数,在其中加入:

  Cancel = m_bPop;

  这样CNoPopHtmlView将不在打开广告窗口,关键在于了解IE的下载、弹出窗口的过程。(本文的方法同样对CWebBrowser2适用、不论你是用VC还是Delphi都有效,关键在于了解IE下载、弹出窗口的过程)

  上面说的是在自编浏览器中过滤广告窗口。

  其实你完全可以利用BHO(Browser Helper Object)写一个针对IE的广告窗口过滤器。

  在BHO里你利用IObjectWithSiteImpl::SetSite获得IWebBrowser2指针,然后利用Invoke处理OnDownloadBegin/OnDownloadComplete/OnNewWindow2等事件就可以,模式同上。

------------------------------

啊~~食指在打完上面最后一个字的时候不幸骨折了。




资料整理:编程先锋 http://wlbookwl.myrice.com 站长:小黑侠
 
哈哈,又找到好东西了,收藏
 
非常感谢tseug,这300分有280已经是你的了.
我对你说的似乎有一些了解了,但就是
OnDownloadBegin ---->发现---->OnNewWindow2 ---->OnDownloadComplete
这一句中怎么发现window.open等Js或者vbs??
BHO我已经做出来了,关键就在于怎么找到这个window.open了.

 
tseug的方法和思路很好,
在窗口弹出之前拦截它,才是最好的方法
Zero Popup就是这么一个广告杀手
 
好 做好了贴出来给我们一份
 
弹出的应该也是一个 IE窗口。可能比较难于区分。
className 有区别的可能性不大。因为非广告窗口也可通过这种方式弹出。
 
凡是弹出的窗口统统杀掉,没有办法判断那个是广告.
但怎么判断那个是要弹出的窗口呢?
 
弹出窗口的class 是 IEFrame
 
给你一个建议
1、首先要用钩子,用shell的那个,hook 住 窗体创建的消息,然后判断,
如果是广告条 就杀掉。不要用timer ,那让人感觉写的东西是垃圾(反正我这么认为)
因为timer的方式太被动了。
2、广告条怎么判断,你判断是不是ie, 但是广告条有一个特点,没有工具栏,
就用这个特征判断了。
另外,程序我已经写了,有点麻烦,hook 比较麻烦其他得倒也无所谓。
 
hook与timer都不可取,最好的办法我已经找到了就是BHO,问题就是如何在窗口出来之前判断
哪些是广告窗口??
 
应该没有什么更好的办法,一是根据URL,二是根据内容(但这要下载了之后才知道了)
所以,多数过滤软件都是根据URL来判断的,当然这个URL列表是用户自己维护的。
 
tseug,你的方法没有办法拦截timer和onmouseover等事件中的popup。
zero popup是做的很好,但是我认为做的最好的是popup purger。
zero popup对timer和onmouseover事件中的popup也不是全部能拦截掉。
你们可到 www.popup-purger.com 取下载一个试一下,非常好用。
 
好 做好了贴出来给我们一份
 
to www:
你说得很好玩呀,如果能在窗口出来之前就知道是广告条我们还讨论什么,那么判断
你又是通过什么,还不是要钩子,不过绝对不是钩 你的鼠标时间 或者键盘时间,是shell
窗口创建的消息。
 
to 人在昆明:
用什么钩子,用BHO(Browser Helper Object)就搞定.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部