四联光电智能照明论坛
标题:
如何在使用webBrowser时不弹出新窗口?
[打印本页]
作者:
admin
时间:
2015-11-12 17:21
标题:
如何在使用webBrowser时不弹出新窗口?
在使用webBrowser时,本来想网页总在自己的客户端里显示,结果总是有网页在点击时会跳出来,新建一个窗口显示,不好控制,自己试了几种方法,又从网上搜了一下,总结了以下几种方法:
(1)把链接的“target”属性改成“_self”
本方法适合模拟点击链接:
if(link.GetAttribute("target") != "")link.SetAttribute("target", "_self");
link.InvokeMember("click");
复制代码
(2)在网页加载完成后,把所有的链接和Form提交目标均指向“_self”:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
foreach (HtmlElement archor in webBrowser1.Document.Links)
{
archor.SetAttribute("target", "_self");
}
//将所有的FORM的提交目标,指向本窗体
foreach (HtmlElement form in webBrowser1.Document.Forms)
{
form.SetAttribute("target", "_self");
}
}
复制代码
(3)参考木楠博客-webBrowser用法小结
http://www.cnblogs.com/tyn-munan/archive/2011/12/03/2274970.html
通过其自带的webBrowser1.NewWindow事件就可以解决。
private void webBrowser1_NewWindow(object sender, CancelEventArgs e)
{
e.Cancel = true;
webBrowser1.Navigate(webBrowser1.StatusText);
}
复制代码
e.Cancel=true,是指将打开新窗体的事件取消,而下一句就是使webBrowser控件跳转到原来会打开的新地址。但是,有时候这种方法会无效。我遇到的情况是,页面是通过post数据到另一页面这种形式,在这种情况下,上面的事件就不够用了。下面解释一下另一种用法。
我的思路是,其post的数据是关键,只要获取到要传递的数据,在将这个传递的事件取消,由我们自己来跳转。这一过程在webBrowser控件里面是没有对应事件的。还好,微软提供了另一组接口。
首先,引用shdocvw.dll,这个dll可以在C:\WINDOWS\system32下找到。
而后,实例化这个接口,来获得更多的事件
private SHDocVw.WebBrowser SHWebBrowser;
SHWebBrowser=(SHDocVw.WebBrowser)webBrowser1.ActiveXInstance;
SHWebBrowser.NewWindow2 += new DWebBrowserEvents2_NewWindow2EventHandler(SHWebBrowser_NewWindow2);
SHWebBrowser.BeforeNavigate2 += new DWebBrowserEvents2_BeforeNavigate2EventHandler(SHWebBrowser_BeforeNavigate2);
复制代码
这里就用的到的就这两个事件,其他详细的事件描述,可以参照这个链接如何对webbrowser和IE编程。首先就是避免新窗体,NewWindows事件
private void SHWebBrowser_NewWindow2(ref object o, ref bool cancel)
{
webBrowser1.Navigate(webBrowser1.StatusText);
cancel = true;
}
复制代码
里面必须有webBrowser1.Navigate(webBrowser1.StatusText)这个语句,这是为了触发BeforeNavigate事件,因为BeforeNavigate会发生在每一个导航中。而后,就是获取post的数据了
private void SHWebBrowser_BeforeNavigate2(object pDisp, ref object URL, ref object Flags,
ref object TargetFrameName, ref object PostData, ref object Headers, ref bool Cancel)
{
string strpostData = System.Text.Encoding.ASCII.GetString(PostData as byte[]);//关键,将上传的POST截取
}
复制代码
这样,我们就可以获取post的数据来进行下一步的操作了。
作者:
魔幻使者Jack
时间:
2015-11-16 16:35
我一般都是第三个方法重载WEB控件方法NewWindows:实现控制打开新窗口的方式
附代码:
void CBaiduMapDlg::NewWindow3Explorer1(LPDISPATCH* ppDisp, BOOL* Cancel, unsigned long dwFlags, LPCTSTR bstrUrlContext, LPCTSTR bstrUrl)
{
*Cancel = TRUE;
CString strUrl;
strUrl = bstrUrl;
m_WebBrowser.Navigate(strUrl, NULL, NULL,NULL,NULL);
ShowWindow(SW_SHOW);
// TODO: 在此处添加消息处理程序代码
/* // 只在一个对话框中操作网页
*Cancel = TRUE;
CString strUrl;
strUrl = bstrUrl;
VARIANT vInfo;
VariantInit(&vInfo);
this->m_sa.Navigate(strUrl, &vInfo, &vInfo, &vInfo, &vInfo);
this->ShowWindow(SW_SHOW);
//***************************************两种方法要求***********************************************
// 在多个对话框中进行网页操作
*Cancel = TRUE;
CString strUrl;
strUrl = bstrUrl;
// 新建对话框
CMFCApplication1Dlg *pNewDlg = new CMFCApplication1Dlg;
pNewDlg->Create(IDD_MFCAPPLICATION1_DIALOG, this);
pNewDlg->ShowWindow(SW_SHOW);
// 网页导航,新的对话框中的webbrowser控件!
VARIANT vInfo;
VariantInit(&vInfo);
pNewDlg->m_sa.Navigate(strUrl, &vInfo, &vInfo, &vInfo, &vInfo);*/
}
复制代码
作者:
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