四联光电智能照明论坛

标题: 如何在使用webBrowser时不弹出新窗口? [打印本页]

作者: admin    时间: 2015-11-12 17:21
标题: 如何在使用webBrowser时不弹出新窗口?
在使用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的数据来进行下一步的操作了。
作者: 魔幻使者Jack    时间: 2015-11-16 16:35
我一般都是第三个方法重载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. }
复制代码


作者: admin    时间: 2015-11-16 21:44
魔幻使者Jack 发表于 2015-11-16 16:35
我一般都是第三个方法重载WEB控件方法NewWindows:实现控制打开新窗口的方式
附代码:
void CBaiduMapD ...

哦,这是C++,而且是自己处理新建窗口消息,生成一个新窗口弹出来。




欢迎光临 四联光电智能照明论坛 (http://5xhome.com/) Powered by Discuz! X3.2