张硕(CathyEagle)的专栏

      ——朝闻道,夕死可矣。

用户操作
[即时聊天] [发私信] [加为好友]
CathyEagle
CathyEagle的公告
eagleboost@21cn.com

声明:本专栏之文章及照片,除特别注明外均为本人原创,如有转载,敬请注明出处。若需商业用途,请与本人联系。

Google

最近评论
CathyEagle:如果你用的是CHtmlView的话,可以这样写

IWebBrowser2* CMyView::GetActiveWebBrowserPtr(void)
{
if ( m_pBrowserApp )
return m_pBrowserApp;
else
return NULL;
}
renhit:实在惭愧,没明白这里:GetActiveWebBrowserPtr返回活动的浏览器IWebBrowser2接口指针

GetActiveWebBrowserPtr这个函数该怎么实现?不是微软提供的吧?

谢谢
wangzivc2004:非常感谢楼主, 帮了我大忙了.
由于自己不才, 没有看过Hook方面的知识, 虽然知道MFC也是利用Hook模拟模态对话框的, 但是自己就是不知咋办. 现在老大让我用WTL做东西, 发现那里面模态对话框恶心的连键盘消息都无法响应, 最终还是无意间发现这篇经典的文章.

再次感谢
CathyEagle:看了老兄的溢美之词,汗流浃背in……
sunhui:昨天聊到深夜,决定今天来拜读大作,果然精彩!非常佩服你的精细,期待你的MiExplorer早日面世……,很羡慕你的文档写作能力。
文章分类
收藏
    相册
    恋之风景
    我的生活
    C++
    C++ Templates 中文
    Effective STL 中文
    周星星之Blog
    Delphi
    Delphi窑洞
    Torry.net
    大富翁论坛
    源码空间
    绝好的Delphi Tips
    Java
    !Java
    Misc
    SourceForge.org
    Think in Patterns 中文
    ZoCSoft.com
    阿甘的家
    友情链接
    Stanley_Xu 的专栏
    编程手札
    综合
    CodeGuru
    The Code Project
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Internet Explorer 编程简述(一)WebBrowser还是WebBrowser_V1收藏

    新一篇: Internet Explorer 编程简述(二)在IE中编辑OLE嵌入文档 | 旧一篇: Internet Explorer 编程简述(序)

    关键字:WebBrowser, WebBrowser_V1,NewWindow, NewWindow2, NewWindow3, INewWindowManager 

    你的机器上总是存在着“两”个WebBrowser,一个叫WebBrowser,另一个叫WebBrowser_V1,其CLASSID如下:

      CLASS_WebBrowser: TGUID = '{8856F961-340A-11D0-A96B-00C04FD705A2}';
      CLASS_WebBrowser_V1: TGUID = '{EAB22AC3-30C1-11CF-A7EB-0000C05BAE0B}';

    它们分别对应的接口是IWebBrowser2和IWebBrowser。问题是我们该用哪一个呢?
    按照微软的推荐,应该尽量使用前者,因为后者是为兼容Internet Explorer 3.x而保留的(尽管它能够响应来自Internet Explorer 3.x、4.x、5.x、6.x的事件),相应的IWebBrowser和IWebBrowserApp接口也应抛弃。

    由于Internet Explorer 3.x年代久远,导致WebBrowser_V1提供的事件少得可怜,但值得一提的是它提供的两个事件OnNewWindow和OnFrameBeforeNavigate有着与OnBeforeNavigate几乎相同的参数:

    OnBeforeNavigate(
      BSTR URL, 
      long Flags, 
      BSTR TargetFrameName, 
      VARIANT* PostData, 
      BSTR Headers, 
      BOOL FAR* Cancel)

    OnNewWindow(
      BSTR URL, 
      long Flags, 
      BSTR TargetFrameName, 
      VARIANT* PostData, 
      BSTR Headers, 
      BOOL FAR* Processed)

    OnFrameBeforeNavigate(
      BSTR URL,
      long Flags, 
      BSTR TargetFrameName, 
      VARIANT* PostData, 
      BSTR Headers, 
      BOOL FAR* Cancel)

    所以使用WebBrowser_V1使得我们的浏览器在有新窗口打开时能够轻易捕捉到其URL及相关的数据,如果将Processed设置为TRUE,则可取消新窗口的弹出。同样,处理Frame也比在WebBrowser中来得容易。

    但WebBrowser_V1的致命弱点是它不支持高级接口,如IDocHostUIHandler,即便我们实现了IDocHostUIHandler接口,也不会被WebBrowser_V1调用。所以希望在自己的浏览器中实现XP的界面主题、扩展IE的DOM(Document Object Model)等高级控制的话,就肯定不能选择WebBrowser_V1了。

    处理新窗口实在是很麻烦的一件事,不知道微软为什么在新版本的OnNewWindow2事件中去掉了URL这样的参数,而且OnNewWindow2事件不能完全捕捉到所有的新窗口打开。但如果安装了Windows XP SP2的话,好处又回来了。

    Windows XP SP2对Internet Explorer 6作了升级,并且提供了一个新的事件OnNewWindow3,它在OnNewWindow2事件之前发生,也包含了让我们能够加以过滤处理的新窗口的URL等参数,再加上INewWindowManager接口,就是实现Windows XP SP2中过滤广告窗口功能的基础。

    参考资料
    MSDN:185538 HOWTO: Cause Navigation to Occur in Same WebBrowser Window

    引用地址Internet Explorer 编程简述(一)WebBrowser还是WebBrowser_V1

    发表于 @ 2004年09月06日 16:10:00|评论(loading...)|编辑

    新一篇: Internet Explorer 编程简述(二)在IE中编辑OLE嵌入文档 | 旧一篇: Internet Explorer 编程简述(序)

    评论

    #nana_tubi 发表于2004-10-05 00:05:00  IP:
    TrackBack来自《Internet Explorer 编程简述(一)WebBrowser还是WebBrowser_V1 》

    Ping Back来自:blog.csdn.net
    #nana_tubi 发表于2004-10-05 12:06:00  IP:
    TrackBack来自《Internet Explorer 编程简述(一)WebBrowser还是WebBrowser_V1 》

    Ping Back来自:blog.csdn.net
    #埃及小白 发表于2004-09-10 01:19:00  IP: 219.233.101.*
    showModelessDialog 我还在研究。我在IOleCommandTarget.Exec()中监视,并没有发现有触发的消息。一时还摸不着头脑。

    有空多联系吧。QQ或者mail都可以。我也在Blog注册了。
    http://blog.csdn.net/stanley_xu/
    #CathyEagle 发表于2004-09-10 04:23:00  IP: 222.18.4.*
    IInternetSecurityMgrSite接口也许有用,它有一个EnableModeless的方法,应该是用来控制Modeless Dialog的。不过我还没有做成试验。

    IInternetSecurityMgrSite::EnableModeless Method

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

    Enables the use of modeless pop-up windows.

    Syntax

    HRESULT EnableModeless( BOOL fEnable
    );
    Parameters

    fEnable
    [in] Boolean value that specifies whether modeless pop-up windows are used. TRUE enables modeless pop-up windows; FALSE disables them.
    Return Value

    Returns S_OK if successful, or E_FAIL otherwise.
    #埃及小白 发表于2004-09-09 18:43:00  IP: 219.233.101.*
    不过在用户没有升级到SP2之前,就享受不到这个OnNewWindow3还是比较可惜的。现在showModelessDialog是很猖獗的时期。就算可以用其它办法屏蔽这类对话框,但是对于这类对话框中显示的网页自动执行的脚本还是没有什么好办法解决。
    #CathyEagle 发表于2004-09-09 20:21:00  IP: 222.18.4.*
    嗨,好久不见:-)
    showModelessDialog确实非常烦人,不过由于是通过脚本调用的,所以应该可以通过禁止其调用以阻止窗口弹出。
    我在SP2上试验的结果是只要有脚本调用,浏览器就会在窗口上方显示警告消息,可以说是从比较大的范围内保证了安全问题。
    #埃及小白 发表于2004-09-10 23:46:00  IP: 219.233.101.*
    有一点我觉得奇怪:IDocHostUIHandler也有EnableModeless,你为什么去研究IInternetSecurityMgrSite::EnableModeless。不过二者似乎都不工作。IDocHostUIHandler提供了很多方法。不过好多都不怎么被用到。我觉得挺奇怪的。
    #CathyEagle 发表于2004-09-11 00:17:00  IP: 222.18.4.*
    两者是不一样的,注意看说明。

    IDocHostUIHandler::EnableModeless Method

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

    Called by the MSHTML implementation of IOleInPlaceActiveObject::EnableModeless. Also called when MSHTML displays a modal UI.

    Syntax

    HRESULT EnableModeless( BOOL fEnable
    );
    Parameters

    fEnable
    [in] BOOL that indicates if the host's modeless dialog boxes are enabled or disabled.
    TRUE
    Modeless dialog boxes are enabled.
    FALSE
    Modeless dialog boxes are disabled.
    Return Value

    Returns S_OK if successful, or an error value otherwise.

    至于其它的方法,都有其用处,不过是用的频率低一些罢了。
    #CathyEagle 发表于2004-09-14 15:20:00  IP: 211.138.91.*
    showModelessDialog的调用我看有个方法,注册一个协议插件,获取源代码,把showModelessDialog的调用去掉。
    #lingll 发表于2006-05-05 17:13:00  IP: 222.200.164.*
    最近在搞showModelessDialog的问题,我是用vb做的,
    但不知为何,到了INewWindowManager.EvaluateNewWindow的时候就出错,出错应该是在该方法调用结束后,
    我可以由该函数pszUrl参数获得新打开对话框的url,

    我写的 INewWindowManager 如下,不知有错没有,因为vb似乎不支持LPWSTR,所以我改为long了,参数似乎是没错的.
    interface INewWindowManager;
    [
    odl,
    uuid(D2BC4C84-3F72-4a52-A604-7BCBF3982CBB), //IID_INewWindowManager
    ]
    interface INewWindowManager : IUnknown
    {

    HRESULT EvaluateNewWindow(
    [in] long pszUrl,
    [in] long pszName, [in] long pszUrlContext,
    [in] long pszFeatures,
    [in] BOOL fReplace,
    [in] LONG dwFlags
    );
    };

    一直无法知道为何出错,不知能给个用c实现的例子(如果是vb就最好了),谢谢
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © CathyEagle