四联光电智能照明论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4327|回复: 2
打印 上一主题 下一主题

如何在使用webBrowser时不弹出新窗口?

[复制链接]
  • TA的每日心情
    开心
    2018-12-28 16:25
  • 817

    主题

    1556

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    14941
    跳转到指定楼层
    楼主
    发表于 2015-11-12 17:21:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    在使用webBrowser时,本来想网页总在自己的客户端里显示,结果总是有网页在点击时会跳出来,新建一个窗口显示,不好控制,自己试了几种方法,又从网上搜了一下,总结了以下几种方法:
    (1)把链接的“target”属性改成“_self”
    本方法适合模拟点击链接:
    1.         if(link.GetAttribute("target") != "")link.SetAttribute("target", "_self");
    2.         link.InvokeMember("click");
    复制代码

    (2)在网页加载完成后,把所有的链接和Form提交目标均指向“_self”:
    1.        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    2.         {
    3.             foreach (HtmlElement archor in webBrowser1.Document.Links)
    4.             {
    5.                 archor.SetAttribute("target", "_self");
    6.             }
    7.             //将所有的FORM的提交目标,指向本窗体
    8.             foreach (HtmlElement form in webBrowser1.Document.Forms)
    9.             {
    10.                 form.SetAttribute("target", "_self");
    11.             }
    12.         }
    复制代码


    (3)参考木楠博客-webBrowser用法小结
    http://www.cnblogs.com/tyn-munan/archive/2011/12/03/2274970.html
    通过其自带的webBrowser1.NewWindow事件就可以解决。
    1. private void webBrowser1_NewWindow(object sender, CancelEventArgs e)
    2. {
    3.     e.Cancel = true;
    4.     webBrowser1.Navigate(webBrowser1.StatusText);
    5. }
    复制代码

    e.Cancel=true,是指将打开新窗体的事件取消,而下一句就是使webBrowser控件跳转到原来会打开的新地址。但是,有时候这种方法会无效。我遇到的情况是,页面是通过post数据到另一页面这种形式,在这种情况下,上面的事件就不够用了。下面解释一下另一种用法。
    我的思路是,其post的数据是关键,只要获取到要传递的数据,在将这个传递的事件取消,由我们自己来跳转。这一过程在webBrowser控件里面是没有对应事件的。还好,微软提供了另一组接口。
    首先,引用shdocvw.dll,这个dll可以在C:\WINDOWS\system32下找到。
    而后,实例化这个接口,来获得更多的事件
    1. private  SHDocVw.WebBrowser SHWebBrowser;
    2. SHWebBrowser=(SHDocVw.WebBrowser)webBrowser1.ActiveXInstance;
    3. SHWebBrowser.NewWindow2 += new DWebBrowserEvents2_NewWindow2EventHandler(SHWebBrowser_NewWindow2);
    4. SHWebBrowser.BeforeNavigate2 += new DWebBrowserEvents2_BeforeNavigate2EventHandler(SHWebBrowser_BeforeNavigate2);
    复制代码

    这里就用的到的就这两个事件,其他详细的事件描述,可以参照这个链接如何对webbrowser和IE编程。首先就是避免新窗体,NewWindows事件
    1. private void SHWebBrowser_NewWindow2(ref object o, ref bool cancel)
    2. {
    3.     webBrowser1.Navigate(webBrowser1.StatusText);
    4.     cancel = true;
    5. }
    复制代码

    里面必须有webBrowser1.Navigate(webBrowser1.StatusText)这个语句,这是为了触发BeforeNavigate事件,因为BeforeNavigate会发生在每一个导航中。而后,就是获取post的数据了
    1. private void SHWebBrowser_BeforeNavigate2(object pDisp, ref object URL, ref object Flags,
    2. ref object TargetFrameName, ref object PostData, ref object Headers, ref bool Cancel)
    3. {
    4.     string strpostData = System.Text.Encoding.ASCII.GetString(PostData as byte[]);//关键,将上传的POST截取
    5. }
    复制代码

    这样,我们就可以获取post的数据来进行下一步的操作了。
  • TA的每日心情
    郁闷
    2016-1-18 09:58
  • 7

    主题

    30

    帖子

    326

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    326
    沙发
    发表于 2015-11-16 16:35:16 | 只看该作者
    我一般都是第三个方法重载WEB控件方法NewWindows:实现控制打开新窗口的方式
    附代码:
    1. void CBaiduMapDlg::NewWindow3Explorer1(LPDISPATCH* ppDisp, BOOL* Cancel, unsigned long dwFlags, LPCTSTR bstrUrlContext, LPCTSTR bstrUrl)
    2. {
    3.         *Cancel = TRUE;
    4.         CString strUrl;
    5.         strUrl = bstrUrl;
    6.         m_WebBrowser.Navigate(strUrl, NULL, NULL,NULL,NULL);
    7.         ShowWindow(SW_SHOW);
    8.         // TODO:  在此处添加消息处理程序代码
    9.         /*  //  只在一个对话框中操作网页
    10.   *Cancel = TRUE;
    11.   CString strUrl;
    12.   strUrl = bstrUrl;
    13.   VARIANT vInfo;
    14.   VariantInit(&vInfo);
    15.   this->m_sa.Navigate(strUrl, &vInfo, &vInfo, &vInfo, &vInfo);
    16.   this->ShowWindow(SW_SHOW);
    17.   //***************************************两种方法要求***********************************************
    18.   //  在多个对话框中进行网页操作
    19.   *Cancel = TRUE;
    20.   CString strUrl;
    21.   strUrl = bstrUrl;
    22.   // 新建对话框  
    23.   CMFCApplication1Dlg *pNewDlg = new CMFCApplication1Dlg;
    24.   pNewDlg->Create(IDD_MFCAPPLICATION1_DIALOG, this);
    25.   pNewDlg->ShowWindow(SW_SHOW);
    26.   // 网页导航,新的对话框中的webbrowser控件!  
    27.   VARIANT vInfo;
    28.   VariantInit(&vInfo);
    29.   pNewDlg->m_sa.Navigate(strUrl, &vInfo, &vInfo, &vInfo, &vInfo);*/
    30. }
    复制代码

  • TA的每日心情
    开心
    2018-12-28 16:25
  • 817

    主题

    1556

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    14941
    板凳
     楼主| 发表于 2015-11-16 21:44:22 | 只看该作者
    魔幻使者Jack 发表于 2015-11-16 16:35
    我一般都是第三个方法重载WEB控件方法NewWindows:实现控制打开新窗口的方式
    附代码:
    void CBaiduMapD ...

    哦,这是C++,而且是自己处理新建窗口消息,生成一个新窗口弹出来。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Silian Lighting+ ( 蜀ICP备14004521号-1 )

    GMT+8, 2024-5-9 09:38 , Processed in 1.093750 second(s), 26 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表