webBrowser用法小结

    最近在使用webBrowser时,遇到了一些繁琐的问题,虽然最终大部分都解决了,但还是消耗了一段时间。在此将遇到的问题记录下来。

1.问题:点击链接的时候,弹出新IE窗体。

解决方法:原本使用webBrowser就是为了想在客户端程序里面显示网页,可是一点击连接就跳出新窗体无疑让人相当头痛。还好,大部分情况下,通过其自带的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的数据来进行下一步的操作了。

2.问题:如何获取webBrowser里面按键的情况,就是指,焦点在网页时,获取键盘的按钮情况。

这个是通过一个PreviewKeyDown事件来实现的,事件是这种形式webBrowser1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e),只需要获取e.KeyValue的值就可以了,遇到的问题在于,这个事件会触发两次。查询了很多相关资料都没有发现原因,后来只能归咎于微软的一个bug吧。目前的解决方案是通过设置一个bool参数。来判断是否是第一次加载。

3.程序安装的时候出现未能注册模块(程序路径)\ieframe.dll提示

这种情况的出现,是因为上面引用的shdocvw.dll,目前发现了一个折中的解决方法,在安装程序里面,可以看到ieframe.dll的一个引用,右击选择排除。这样安装的时候就不会出现这种提示。只要安装的目标机子上又ie6或者ie7,程序就不会有任何问题,考虑到这时winform开发,一般情况下,这种方法可行。

posted @ 2011-12-03 21:06  木南  阅读(11964)  评论(3编辑  收藏  举报