在C# winform开发中,在form中使用webbrowser,实现一些尤其是界面方面的编程,显得尤其方便,但很多时候,我们需要winform和webbrowser里面的功能能相互调用,一般相互调用有几下集中情况:
1、在winform里呼叫webbrowser里的javascript函数
这个比较简单,在c#里建立一个点击事件,其中使用:
webBrowser1.Document.InvokeScript("callFromWinForm", new object[] { "hellow","world" });
就可以完成调用,其中callFromWinForm是在demo.html里的js函数。new Object[] {这里是参数,以”,”分割}
2、在winform里模拟webbrowser里的DOM事件
比如demo.html里有这段代码:
hello phpmsg!
那么在C#里建立一个事件,使用:
HtmlElement link = webBrowser1.Document.GetElementById("link"); link.InvokeMember("click");
即可模拟鼠标点击链接,上面的例子是根据ID获取,如果有多个链接需要模拟点击可以这样:
HtmlElementCollection links = webBrowser1.Document.GetElementsByTagName("a"); foreach(HtmlElement link in links){ link.InvokeMember("click"); }
当然,除了click事件,其他比如mouseover等都可以用的。
3、捕获DOM事件,模拟调用C#中的函数
假设html中有这样一个按钮:
我们希望点击的时候执行c#中的函数,
我们在c#中这样处理:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { // 注册这个事件捕获 webBrowser1.Document.GetElementById("htmlBtn").Click += new HtmlElementEventHandler(htmlBtn_Click); } //响应函数 private void htmlBtn_Click(object sender,HtmlElementEventArgs e) { String value = webBrowser1.Document.GetElementById("htmlBtn").GetAttribute("value"); MessageBox.Show("phpmsg.com from c# with value=" + value); }
实际上,这个实现方式并不是“调用”,而仅仅是通过“响应”进行回调,他会在当前当前html中的click事件后“追加”一个click响应,如果你在html中本身已经为htmlBtn绑定了click事件,你会发现先执行html里的click事件,然后执行c#中的click。
笔者在开发过程中,遇到一些特殊情况:
我在html中有很多按钮,并且ID号是实现没有办法固定,我希望实现点击html中按钮的时候,C#可以为每个按钮打开一个新的winform窗体,并且要将一些参数传递过来。这时候发现C#中没有办法知道点击的具体是哪个按钮,当然,相关参数也不可能传递到C#中。
后来发现利用webbroser.Navigating可以绕道解决问题,大概代码如下:
你需要在html中,编写类似代码:
聊天室123 聊天室456
然后在c#中:
private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) { string url = e.Url.ToString(); if (url.StartsWith("chat://")){ e.Cancel = true; MessageBox.Show(url); } }
然后你只需要把需要传递的参数通过url传递过来,解析url里的参数,就完美了。
4、在webbrowser里呼叫C#中的函数
有时候更直接点,我们需要在webbrowser里直接呼叫C#中的函数,
一般需要利用window.external来完成,比如
C#中建立一个function
public void test(String s) { MessageBox.Show(s); }
但是需要注意的是,在C#中需要在开始设定权限才可以:
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")] [System.Runtime.InteropServices.ComVisibleAttribute(true)]
另外需要设定Webbrowser的
webBrowser1.ObjectForScripting = this;
以上几种情况,基本可以解决绝大部分问题,善加利用相信可以大幅度减少winform的编程量。