C#中WebBrowser与Winform互操作

在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的编程量。

发表评论