WebBrowser控件的简单应用2

简介: 原文:WebBrowser控件的简单应用2第一个简单应用里面讲述的是如何模拟调用当前网页的元素的事件或者赋值/取值。这次的应用讲述的是1:如何处理弹出新页面的事件(总是在我的浏览器里面现实新页面)2:如何处理window.close事件,让我的浏览器页关闭3:让html页面的js调用我的browse的函数4:如何让我的browse调用html的js函数。
原文: WebBrowser控件的简单应用2

第一个简单应用里面讲述的是如何模拟调用当前网页的元素的事件或者赋值/取值。
这次的应用讲述的是
1:如何处理弹出新页面的事件(总是在我的浏览器里面现实新页面)
2:如何处理window.close事件,让我的浏览器页关闭
3:让html页面的js调用我的browse的函数
4:如何让我的browse调用html的js函数。

使用场景:一个web程序,让用户使用自定义浏览器来浏览,该web程序会调用浏览者机器上一些接口。
我的这个浏览器叫做AppBrowser。
关于ObjectForScripting 的介绍http://msdn2.microsoft.com/en-us/library/system.windows.forms.webbrowser.objectforscripting.aspx
首先,第一个问题。
如果只是放置一个browse在那里,在html中打开新页面的时候,他默认使用IE或者其他浏览器来打开网页。如果想要让我的browse也同时能处理所有的新开页面,就要增加一个对_NewWindow事件的处理。
        private void wb_Container_NewWindow(object sender, CancelEventArgs e)
        {
            e.Cancel = true;
            AppBrowser newAB = new AppBrowser(wb_Container.Url.ToString());
            newAB.Show();
        }
在这里要注意的是
1:e.Cancel = true;是为了取消这个事件,不然又打开一个IE
2:wb_Container.Url.接受到的是新页面的参数

关于关闭浏览器
通常,如果设置了这样的js:window.close,那么,IE会自动关闭。但是我的browse却不会,至少默认的是如此的。
为了关闭我的浏览器,我需要接收这个函数。但是,很可惜,找了半天都没找到这个事件在那里处理,于是结合下一个问题,一下子解决了。(其实是半个解决,只有自己写的web程序才能处理)。

关于web调用我的浏览器的函数。
这就成了web和win的交互了,这个win就是在客户端的。以前交互的方式是写一个ActiveX控件,让web调用他,进而访问客户机器上的一些资源。现在的这种方式则是通过自己提供一个符合COM接口的自定义browse来实现。
1:我的browse必须是符合COM接口的[System.Runtime.InteropServices.ComVisibleAttribute(true)]
2:设置一个属性 this.wb_Container.ObjectForScripting = this
这样,Web中就可以这样调用了javascript:window.external.xxx('xx')。比方说上边的那个关闭窗口的调用就可以这样写:
onclick="javascript:window.external.close();"
这个调用,其实是调用的我的browse的Close函数。这个函数是我的winForm上默认的那一个函数。调用其他函数亦然,只要是公开方法就可以。

关于如何browse调用web页面中的函数。
第一个,可以通过直接调用页面中元素的方式来实现,在我上一篇里面有所介绍。
第二个,就是可以直接访问.Document.InvokeScript函数来实现。
比如:
        public object InvokeHtmlJsScript(string scriptName,object[] objects)
        {
           return  this.wb_Container.Document.InvokeScript(scriptName, objects);
        }


img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 简单的类
 1img_a6339ee3e57d1d52bc7d02b338e15a60.gif  //set this class as a COM
 2img_a6339ee3e57d1d52bc7d02b338e15a60.gif    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
 3img_a6339ee3e57d1d52bc7d02b338e15a60.gif    public partial class AppBrowser : Form
 4img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif    img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
 5img_33d02437d135341f0800e3d415312ae8.gif        public AppBrowser()
 6img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
 7img_33d02437d135341f0800e3d415312ae8.gif            InitializeComponent();
 8img_105a1e124122b2abcee4ea8e9f5108f3.gif        }

 9img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        /**//// <summary>
10img_33d02437d135341f0800e3d415312ae8.gif        /// which the url will be go
11img_33d02437d135341f0800e3d415312ae8.gif        /// </summary>
12img_105a1e124122b2abcee4ea8e9f5108f3.gif        /// <param name="url"></param>

13img_33d02437d135341f0800e3d415312ae8.gif        public AppBrowser(string url)
14img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
15img_33d02437d135341f0800e3d415312ae8.gif            InitializeComponent();
16img_33d02437d135341f0800e3d415312ae8.gif            _url = url;
17img_33d02437d135341f0800e3d415312ae8.gif            this.wb_Container.Navigate(_url);
18img_33d02437d135341f0800e3d415312ae8.gif            this.wb_Container.ObjectForScripting = this;//set this to be the COM handler
19img_33d02437d135341f0800e3d415312ae8.gif           
20img_105a1e124122b2abcee4ea8e9f5108f3.gif        }

21img_33d02437d135341f0800e3d415312ae8.gif        private string _url;
22img_33d02437d135341f0800e3d415312ae8.gif        public string Url
23img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
24img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            get img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gifreturn this._url; }
25img_105a1e124122b2abcee4ea8e9f5108f3.gif        }

26img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        /**//// <summary>
27img_33d02437d135341f0800e3d415312ae8.gif        /// open new page in the window which is also in my brower but not in IE
28img_33d02437d135341f0800e3d415312ae8.gif        /// </summary>
29img_33d02437d135341f0800e3d415312ae8.gif        /// <param name="sender"></param>
30img_105a1e124122b2abcee4ea8e9f5108f3.gif        /// <param name="e"></param>

31img_33d02437d135341f0800e3d415312ae8.gif        private void wb_Container_NewWindow(object sender, CancelEventArgs e)
32img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
33img_33d02437d135341f0800e3d415312ae8.gif            e.Cancel = true;
34img_33d02437d135341f0800e3d415312ae8.gif            AppBrowser newAB = new AppBrowser(wb_Container.Url.ToString());
35img_33d02437d135341f0800e3d415312ae8.gif            newAB.Show();
36img_105a1e124122b2abcee4ea8e9f5108f3.gif        }

37img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        /**//// <summary>
38img_33d02437d135341f0800e3d415312ae8.gif        /// this function can be invoked by js in html
39img_33d02437d135341f0800e3d415312ae8.gif        /// like this 'javascript:window.external.ShowMessage('this is invoke from web');'
40img_33d02437d135341f0800e3d415312ae8.gif        /// </summary>
41img_105a1e124122b2abcee4ea8e9f5108f3.gif        /// <param name="msg"></param>

42img_33d02437d135341f0800e3d415312ae8.gif        public void ShowMessage(string msg)
43img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
44img_33d02437d135341f0800e3d415312ae8.gif            MessageBox.Show(msg);
45img_105a1e124122b2abcee4ea8e9f5108f3.gif        }

46img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        /**//// <summary>
47img_33d02437d135341f0800e3d415312ae8.gif        /// can invoke script in the html showing in the webbrowser
48img_33d02437d135341f0800e3d415312ae8.gif        /// </summary>
49img_33d02437d135341f0800e3d415312ae8.gif        /// <param name="scriptName"></param>
50img_33d02437d135341f0800e3d415312ae8.gif        /// <param name="objects"></param>
51img_105a1e124122b2abcee4ea8e9f5108f3.gif        /// <returns></returns>

52img_33d02437d135341f0800e3d415312ae8.gif        public object InvokeHtmlJsScript(string scriptName,object[] objects)
53img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif{
54img_33d02437d135341f0800e3d415312ae8.gif           return  this.wb_Container.Document.InvokeScript(scriptName, objects);
55img_105a1e124122b2abcee4ea8e9f5108f3.gif        }

56img_05dd8d549cff04457a6366b0a7c9352a.gif    }


后记:经过测试,终于找到了一种方法可以解决window.close的问题了(第二个问题)
 1 img_a6339ee3e57d1d52bc7d02b338e15a60.gif     private   void  wb_Container_DocumentCompleted( object  sender, WebBrowserDocumentCompletedEventArgs e)
 2 img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif         img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
 3img_33d02437d135341f0800e3d415312ae8.gif            wb_Container.Document.Window.Unload += new HtmlElementEventHandler(Window_Unload);
 4img_05dd8d549cff04457a6366b0a7c9352a.gif        }

 5 img_a6339ee3e57d1d52bc7d02b338e15a60.gif
 6 img_a6339ee3e57d1d52bc7d02b338e15a60.gif         void  Window_Unload( object  sender, HtmlElementEventArgs e)
 7 img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif         img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
 8img_33d02437d135341f0800e3d415312ae8.gif            if (this.wb_Container.Document == null)
 9img_33d02437d135341f0800e3d415312ae8.gif                this.Close();
10img_05dd8d549cff04457a6366b0a7c9352a.gif        }

原理:
1:代理window的unload事件。这个事件在页面卸载的时候触发。
2:在这个事件之后检查webbrowser的值。如果是window.close,那么属性为空。
可能这个方法还是不够好,但是现下可用了。
目录
相关文章
|
JavaScript 前端开发 C#
WPF技术之WebBrowser控件
WPF WebBrowser控件用于在WPF应用程序中嵌入浏览器功能。
284 0
|
Windows
Winform控件Button及控件的鼠标事件介绍
按钮控件是最常用的,用于实现点击完成操作。其主要处理的就是鼠标点击Click事件。由此可以引发出所有与鼠标有关的事件.....
1337 0
Winform控件Button及控件的鼠标事件介绍
|
Web App开发 C#
C#中WebBrowser控件的使用
今天在YouTube上看了一个关于WebBrowser控件用法的小视频,做一下总结。 首先创建一个WinForm程序,拖入一个textbox控件和一个button按钮,然后拖入一个panel控件,如图所示: 拖入panel控件后,找到WebBrowser控件并双击,WebBrowser控件就...
1284 0
vs2005中的WebBrowser控件的简单应用
原文:vs2005中的WebBrowser控件的简单应用这个控件被封装了一下,和以前的调用方式稍有不同。事件还是那几个,变化不大。方法变了不少。从网上能查到的资料不多,贴出一些代码来作参考。看看这段代码,可以用来分析网页上的元素的类型的。
744 0
|
JavaScript 前端开发 C#
C#中WebBrowser的使用
原文:C#中WebBrowser的使用   其实网络上这类文章很多,我大致从头说说我自己的经验。 1、加入引用   在控件栏按右键,选择“添加/移除项”,选COM组件,选中“Microsoft Web Browser”。
1090 0