|
在使用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的数据来进行下一步的操作了。 |
|