四联光电智能照明论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz

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

已有 685 次阅读2015-11-12 16:16 |个人分类:CSharp| CSharp, 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)参考木楠博客
通过其自带的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的数据来进行下一步的操作了。

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

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

GMT+8, 2024-5-2 00:24 , Processed in 1.046875 second(s), 17 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

返回顶部