Winform 通过 WebBrowser 与 JS 交互

魏刘宏 2019.08.17

之前在使用 Cef (可在 Winform 或 WPF 程序中嵌入 Chrome 内核的网页浏览器的组件)时,使用过在 C# 代码中调用网页 JS 的功能,以为是 Cef 独有的,最近工作中得知,原来 Winform 自带的浏览器控件 WebBrowser 中也有这个功能,那么我们就来看看吧。

我们先建一个 Winform 窗体 FormBrowserJs:

其中左侧是一个 WebBrowser 控件,右边有一个 TextBox 接收网页发来(调用 C# 方法)的消息,另一个 TextBox 提供给我们输入内容,然后点击按钮向网页发送消息(调用网页的 JS 方法)。

后台代码比较少:

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms; namespace WinFormPractice
{
[ComVisible(true)]
public partial class FormBrowserJs : Form
{
public FormBrowserJs()
{
InitializeComponent(); webBrowser.Navigate(Path.Combine(Application.StartupPath, "HTMLBrowserJs.html"));
webBrowser.ObjectForScripting = this;
} public void ShowMsgForJs(string msg)
{
TBRecv.Text += $"{msg}\r\n";
} private void BtnSend_Click(object sender, EventArgs e)
{
webBrowser.Document.InvokeScript("ShowMsgForCSharp", new []{ TBSend.Text });
}
}
}

我们用 Navigate 方法让 WebBrowser 导航到一个本地网页”HTMLBrowserJs.html” 去,并将其 ObjectForScripting 设置为当前类,意思就是网页可以调用这个类里的方法,同时还要设置这个类的特性 ——[ComVisible (true)]—— 以便将方法暴露出去。

ShowMsgForJs 方法就是供网页的 JS 方法调用的,里面就是把消息显示在接收框里。

发送按钮的方法里面使用了 webBrowser.Document.InvokeScript 方法来调用 JS 的方法,第一个参数是方法名,第二个参数是一个 Object 数组,这里其实使用的是一个 string 数组。

下面我们来看看那个网页:

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
<script>
//alert ("准备就绪");
window.external.ShowMsgForJs("准备就绪"); function ShowMsgForCSharp(str) {
var msg = "收到消息:" + str; //1、调用 C# 方法;
window.external.ShowMsgForJs(msg);
//2、改变网页内容;
document.getElementById("info").innerHTML += msg + "<br/>";
//3、弹窗;
alert(msg);
}
</script>
</head>
<body>
<div> 通过 WebBrowser 让 JS 与 C# 代码交互 测试页 </div>
<div id="info"></div>
</body>
</html>

在 script 脚本区,首先通过 window.external.ShowMsgForJs 调用了 Winform 窗体类中的 ShowMsgForJs 方法,提示” 准备就绪”。

然后是供 C# 使用的 ShowMsgForCSharp 方法,里面使用了三种方法来显示收到的消息。

最后来看看运行效果吧:

可以看到发送和接收都成功了。

最后奉上 Demo 地址:https://gitee.com/dlgcy/Practice/tree/master/WinFormPractice

Winform 通过 WebBrowser 与 JS 交互的更多相关文章

  1. WinForm程序执行JS代码的多种方法以及使用WebBrowser与JS交互

    方法一 使用微软官方组件Interop.MSScriptControl 1.msscript.ocx下载的地址   http://www.microsoft.com/downloads/details ...

  2. webbrowser和js交互小结

    一.实现WebBrowser内部跳转,阻止默认打开IE 1.引用封装好的WebBrowserLinkSelf.dll实现 public partial class MainWindow : Windo ...

  3. winform+CefSharp 实现和js交互

    1:窗体加载的时候添加 webBrowser.RegisterJsObject("getuserName", new _Event()); 2:注册C#方法为js方法 /// // ...

  4. C#中webbrowser与javascript(js)交互的方法

    今天在做一个项目的时候需要用c#搞一个webbrowser,然后有些地方还需要与js交互.所以就查了一下资料,发现很多博客提到了但是却没有说下具体的操作.所以我就写一下. 开发环境是Visual St ...

  5. C#和JS交互 WebBrowser实例

    本文实现了WebBrowser的简单例子 1.引用System.Windows.Froms.dll 2.引用WindowsFormsIntegration.dll 代码如下: public parti ...

  6. 浏览器自动化的一些体会5 webBrowser控件之winform和webBrowser的交互

    从winform访问webBrowser,大致就是利用webBrowser提供的解析dom的方法以及用InvokeScript方法执行javascript.这个相对比较简单. 从webBrowser访 ...

  7. C# winform调用WebBrowser经典怪问题总结

    原文:C# winform调用WebBrowser经典怪问题总结 最近一直研究网页数据采集,单单采集数据,其实HtmlAgilityPack就足够了. 对HtmlAgilityPack感兴趣的可以到这 ...

  8. WPF内嵌CEF控件,与JS交互

    1)安装cefsharp.winform包 打开VS2017,打开nuget,找到cefsharp.winform,安装 问:为什么wpf程序不使用cefsharp.wpf? 答:因为cefwpf 4 ...

  9. WinForm中WebBrowser的使用

    最近由于工作需要,研究了下Winform的WebBrowser控件,在这里给大家分享下. 1.WebBrowser导航 WebBrowser在进行导航的时候需要用到Navigate(string ur ...

随机推荐

  1. .NET Core CSharp初级篇 1-2 循环与判断

    .NET Core CSharp初级篇 1-2 本节内容循环与判断 循环 循环是一个在任何语言都是极为重要的语法,它可以用于很多东西,例如迭代数组等等.在C#中,语法层面的循环有:for , fore ...

  2. rsync 未授权访问漏洞

    rsync rsync,remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限.时间.软硬链接等附加信息. rsync是用 &qu ...

  3. Apache配置https

    Apache配置https 之前一直用的是Tomcat,今天突然接到任务要给Apache配置https证书,因为小程序要用.下面把过程列出来以备后续查看. 1.首先你得有ssl证书,没有的可以去购买, ...

  4. Python上下文管理器的使用

    上下文管理器可以控制代码块执行前的准备动作,以及执行后的清理动作. 创建一个上下文管理器类的步骤:(1)一个__init__方法,来完成初始化(可选)(2)一个__enter__方法,来完成所有建立工 ...

  5. [20190510]rman备份的疑问7.txt

    [20190510]rman备份的疑问7.txt --//上午测试rman备份时备份文件大小回缩的测试.链接:--//http://blog.itpub.net/267265/viewspace-26 ...

  6. Linux—系统关机命令详解

    不管是重启系统还是关闭系统,首先要运行 sync 命令,把内存中的数据写到磁盘中.将数据由内存同步写入到硬盘中. [root@localhost ~]# sync 一.shutdown命令 # 立刻关 ...

  7. 执行 npm cache clean报错

    C:\Users\you name>npm cache cleannpm ERR! As of npm@5, the npm cache self-heals from corruption i ...

  8. vue-router 之 keep-alive路由缓存处理include+exclude

    keep-alive 简介 keep-alive 是 Vue 内置的一个组件,可以使被包含的组件保留状态,或避免重新渲染. 用法也很简单: <keep-alive> <compone ...

  9. 目标检测中的pooling操作

    1.SPPnet池化过程 假设这个feature map的尺寸是M*N*256,将这个feature map的每一个channel以4*4,2*2和1*1来划分格子,每个格子里面做max poolin ...

  10. day58_9_24多对多建表手动,form组件(判断类型),cookies和session

    一.多对多建表关系之手动添加. 1.全自动 像之前讲过的一样,我们可以通过manytomanyField的字段来建立多对多关系: class Book(models.Model): title = m ...