在使用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)参考木楠博客
通过其自带的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的数据来进行下一步的操作了。