快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门新葡亰平台游戏APP_龟发之家论坛



近来事情必要,进修了一下winform内嵌webbrowser控件,然后与htm页面中的javascript交互调用的技巧,是以有了这篇心得。

总的来说,javascript与winform的code相互调用,和web开拓中javascript与办事器端代码经由过程ajax相互调用有类似之处。

下面就用三个例子来阐明:

一.将WebBrowser控件放置在winform中,然后,写一个Page1.htm,内容如下:

>

html>head>

title>title>script type="text/javascript">

function test(message){

alert(message);}

script>head>

body>button onclick="test('test called from script code')">Buttonbutton>

body> html>

我将此Page1.htm显示在WebBrowser中看看,这个不难写,在winform中加高低面一句即可。

webBrowser1.Url= new Uri("C:\\workspace\\WindowsFormsApp\\WindowsFormsApp\\Page1.htm");

然后运行,在winform中的webbrowser显示出来这个htm了,点按钮调用javascript函数,弹出alert提示,统统都很正常,没什么稀奇。

二.假如我把javascript中的函数挪到winform的cs代码里,htm页面还能调用的到吗?

这有点ajax的味道了,在客户真个javascript里若何调用webpage.aspx.cs里的代码,在ajaxpro那时刻,是必要在webpage.aspx.cs的代码里注册一下本页供ajax应用,在函数前也要声明一下是ajax函数的。

再说回来,假如想调用winform中的代码,也类似的,要给winform设置一下ComVisibleAttribute(true), 并给webbrowser控件设置一下webBrowser1.ObjectForScripting属性。

web澳门新葡亰平台游戏APPBrowser1.Url= new Uri("C:\\workspace\\WindowsFormsApp\\WindowsFormsApp\\Page1.htm");

webBrowser1.ObjectForScripting = this;

着实,假如做的好,可以把这些代码专门归入一个类中,方便治理,这里就变为:webBrowser1.ObjectForScripting = new 某类()了;

然后,再在winform里写一个函数。

public void Test(String message)

{MessageBox.Show(message, "client code");

}

着末,htm里调用时要用window.external前缀一下Test措施名。

button onclick="window.external.Test('test called from windows code')">Buttonbutton>

然后再运行,就发澳门新葡亰平台游戏APP明,htm里的onclick事故,居然能调用winform里的code了,真是神奇!

完备winform代码如下:

using System;

using System.Win澳门新葡亰平台游戏APPdows.Forms; using System.Security.Permissions;

namespace WindowsFormsApp

{[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]

[System.Runtime.InteropServices.ComVisibleAttribute(true)]public partial class Form2 : Form

{private WebBrowser webBrowser1 = new WebBrowser();

public Form2()

{InitializeComponent();

button1.Text = "call script code from client code";

button1.Dock = DockStyle.Top;button1.Click += new EventHandler(button1_Click);

webBrowser1.Dock = DockStyle.Fill;Controls.Add(webBrowser1);

Load += new EventHandler(Form2_Load);

}

private void Form2_Load(object sender, EventArgs e){

webBrowser1.AllowWebBrowserDrop = false;webBrowser1.IsWebBrowserContextMenuEnabled = false;

webBrowser1.WebBrowserShortcutsEnabled = false;webBrowser1.ObjectForScripting = this;

webBrowser1.Url= new Uri("C:\\workspace\\WindowsFormsApp\\WindowsFormsApp\\Page1.htm");}

public void Test(String message)

{MessageBox.Show(message, "client code");

}}

}

总结一下,关键的webBrowser1.ObjectForScripting属性,ComVisibleAttribute(true)和window.external。

msdn说webBrowser1.ObjectForScripting属性的感化是:获取或设置一个工具,该工具可由显示在 WebBrowser 控件中的网页所包孕的脚本代码造访。应用该属性可以启用 WebBrowser 控件承载的网页与包孕 WebBrowser 控件的利用法度榜样之间的通信。应用该属性可以将动态 HTML (DHTML) 代码与客户端利用法澳门新葡亰平台游戏APP度榜样代码集成在一路。为该属性指定的工具可作为 window.external 工具(用于主机造访的内置 DOM 工具)用于网页脚本。

可以将此属性设置为盼望其公共属性和措施可用于脚本代码的任何 COM 可见的工具。可以经由过程应用 ComVisibleAttribute 对类进行标记使其成为 COM 可见的类。

这一步也至关紧张,假如不设置ComVisibleAttribute(true),那这个法度榜样就不能加载显示htm页面,由于htm里用了window.external.Test()措施,该措施所在的类假如不ComVisible,就无法造访到了。反过来,假如设置了ComVisible,却不设置webBrowser1.ObjectForScripting属性,那代码履行时会报错:window.external无效或找不到工具。

而缺少了window.external,就更甭提了,是以,这三者缺一弗成。

再看看这个window.external,在常见的javascript书中不见踪影,但却异常有用,一个常见的利用是:

引用别人的"在嵌入了浏览器的工程中,除了IE默认供给的外部措施之外,必要网页的脚本中能调用c++代码,要实现这种交互,就必须实现脚本扩展。实现脚本扩展便是在法度榜样中实现一个IDispatch接口,经由过程CHtmlView类的OnGetExternal虚函数返回此接口指针,这样就可以在脚本中经由过程window.external.XXX(关键字wi澳门新葡亰平台游戏APPndow可以省略)来引用接口裸露的措施或属性(XXX为措施或属性名)。"

再看看在c#中的脚本扩展,只必要webBrowser1.ObjectForScripting和ComVisibleAttribute(true)简单一设置就完事了,简单吧!幸福吧!悲催吧!

三.再来看一个,从winform的code里,能调用html页面里的javascript吗?

Page1.htm,删掉落button,只保留javascript脚本。

>

html>head>

title>title>script type="text/javascript">

function test(message){

alert(message);}

script>head>

body>

body> html>

using System;

using System.Windows.Forms; using System.Security.Permissions;

namespace WindowsFormsApp

{[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]

[System.Runtime.InteropServices.ComVisibleAttribute(true)]public partial class Form2 : Form

{private WebBrowser webBrowser1 = new WebBrowser();

private Button button1 = new Button();

public Form2(){

InitializeComponent();

button1.Text = "call script code from client code";button1.Dock = DockStyle.Top;

button1.Click += new EventHandler(button1_Click);webBrowser1.Dock = DockStyle.Fill;

Controls.Add(webBrowser1);Controls.Add(button1);

Load += new EventHandler(Form2_Load);

}

private void Form2_Load(object sender, EventArgs e){

webBrowser1.AllowWebBrowserDrop = false;webBrowser1.IsWebBrowserContextMenuEnabled = false;

webBrowser1.WebBrowserShortcutsEnabled = false;webBrowser1.ObjectForScripting = this;

webBrowser1.Url= new Uri("C:\\workspace\\WindowsFormsApp\\WindowsFormsApp\\Page1.htm");}

private void button1_Click(object sender, EventArgs e)

{webBrowser1.Document.InvokeScript("test",

new String[] { "called from client code" });}

}

}

这回关键的身分便是webBrowser1.Document.InvokeScript了,而webBrowser1.ObjectForScripting,ComVisible不再必要了。

HtmlDocument.InvokeScript 措施的感化是:履行在 HTML 页面中定义的动态脚本函数。

至此,javascript与winform的code就可以相互调用了,感到和web开拓也有些类似。

这项技巧叫在javascript(DHTML)代码和客户端利用法度榜样代码之间实现双向通信.

您可能还会对下面的文章感兴趣: