[Winform]js与webbrowser交互
摘要
目前项目中采用的方式是内嵌浏览器的方式,打开本地或者互联网上的h5页面。在开发之前做了一下调研。目前常用的在C#封装的浏览器内核中,Chromium 内核封装有Xilium.Cefglue、Cefsharp,Webkit 内核封装 Webkit.NET 、OpenWebKitSharp等。webbrowser又与电脑上的IE版本相关,兼容性不好,在win10上,排版是好的,如果拿到win7上,就会出现排版错乱的现象。当然你可以通过修改注册表,进行制定ie的版本。
js与webbrowser的交互
如果在页面上,存在一个js方法,你想通过c#的方式调用该方法,或者出传递值,你可以这样来做。
c#调用js方法
如果页面上提供了js方法,我们可以使用 InvokeScript 方法
public object InvokeScript(string scriptName)
public object InvokeScript(string scriptName,object[] args)
private void button1_Click(object sender, EventArgs e)
{
HtmlDocument doc = this.webBrowser1.Document;
doc.InvokeScript("showMsg", new[] { "Hello world" });
}
测试

js调用c#方法
//
// 摘要:
// 获取或设置一个对象,该对象可由显示在 System.Windows.Forms.WebBrowser 控件中的网页所包含的脚本代码访问。
//
// 返回结果:
// 可用于脚本代码的对象。
//
// 异常:
// T:System.ArgumentException:
// 指定的值时将此属性设置为非公共类型的实例。- 或 -指定的值时将此属性设置为不是 COM 可见类型的实例。
有关详细信息,请参阅System.Runtime.InteropServices.Marshal.IsTypeVisibleFromCom(System.Type)。
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public object ObjectForScripting { get; set; }
webbrowser通过该属性注册js调用的对象。
记得要在JSObject 类上面声明 [System.Runtime.InteropServices.ComVisible(true)] 才能使对象可见。例如在本demo中
[System.Runtime.InteropServices.ComVisible(true)]
public partial class Form1 : Form
{
......do somthing here
}
private void Form1_Load(object sender, EventArgs e)
{
//注册script 调用对象
this.webBrowser1.ObjectForScripting = this;
string exeDir = AppDomain.CurrentDomain.BaseDirectory;
this.webBrowser1.Url = new Uri("file:///" + Path.Combine(exeDir, "www", "test.html"));
this.FormClosing += Form1_FormClosing;
}
js如何使用c#方法?
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
<script> function showMsg(msg) {
alert(msg);
}
window.onload = function () {
document.getElementById("btn").onclick = function () {
var response = window.external.GetDateTime();
document.getElementById("msg").innerHTML = response;
}
}
</script>
</head>
<body>
<input type="button" name="name" value="获取时间" id="btn" />
<div id="msg"></div>
</body>
</html>
测试

自定义js的alert弹窗
c# 方法
public void ShowMsg(string msg)
{
MessageBox.Show(msg, "提示", MessageBoxButtons.OKCancel);
}
js调用
window.external.ShowMsg("自定义弹窗");

总结
webbrowser相对其它内核的浏览器,操作上比较方便,毕竟跟winform集成的比较完美。但也有它的缺点,就是跟系统IE有关系,会出现兼容性的问题,而开发最头疼的就是调ie的兼容性。
webbrowser与ie的关系可以参考这篇文章,可以通过将你的程序添加到注册表,设置webbrowser的版本。
http://www.cnblogs.com/liuzhendong/archive/2012/03/21/2410107.html
[Winform]js与webbrowser交互的更多相关文章
- Winform启动隐藏,WebBrowser交互JS
一.启动隐藏 Winform比较奇怪,Load的时候设置Visiable=false,无效.webBrowser_DocumentCompleted之后调用hide隐藏了窗体,但是在notifyIco ...
- WinForm中嵌入WebBrowser,并且支持C#和JS方法的相互调用
纯粹WinForm界面不够友好,实现数据复杂度高的处理有些力不从心,所以看了看api以后决定用html来做. 我的wlw的代码插件不是很好用,大家凑合看吧 类前说明引用和权限 1: [Permissi ...
- C# WinForm 和 javascript进行交互 使用HTML做界面
01 using System; 02 using System.Collections.Generic; 03 using System.Text; 04 using System.Reflecti ...
- C# WinForm开发系列 - WebBrowser
原文:C# WinForm开发系列 - WebBrowser 介绍Vs 2005中带的WebBrowser控件使用以及一些疑难问题的解决方法, 如如何正确显示中文, 屏蔽右键菜单, 设置代理等; 收集 ...
- js与native交互
js与native交互 UIWebView Native调用JS,使用stringByEvaluatingJavaScriptFromString来解释执行js脚本. //script即为要执行的js ...
- CEF3开发者系列之JS与C++交互之一
JS与Native交互是相对于比较困难的技术,在学习这门技术之前,我们先了解下浏览器内核中的JS引擎与chromium内核的V8引擎相关知识.在浏览器应用中,JS与本地代码互相调用,得益于浏览器内核对 ...
- js与C++交互及C++解析json
转载:http://zhidao.baidu.com/link?url=LLuWzwMmpfVcQeSGv1CrAfRXpnZaetm9xypqwMW6zxLhhKES-rITAsG0-Ku-bSMA ...
- OC和JS之间的交互
OC和JS之间的交互 目录 对OC和JS之间交互的理解 JS调用OC OC调用JS 对OC和JS之间交互的理解 JS调用OC JS文件 function sendCommand(cmd,param){ ...
- 史上最全的 UIWebview 的 JS 与 OC 交互
来源:伯乐在线 - 键盘风筝 链接:http://ios.jobbole.com/89330/ 点击 → 申请加入伯乐在线专栏作者 其实一直想给大家整理一下JS与OC的交互,但是没有合适的机会,今天借 ...
随机推荐
- 【Python】Flask系列-URL和视图笔记
1.学习目标 熟悉Flask相关知识. 熟悉web开发流程. 能独立开发Flask项目. 2.环境配置 Python虚拟环境安装 因为python的框架更新迭代太快了,有时候需要在电脑上存在一个框架的 ...
- 使用SpringCloud搭建高可用服务注册中心
我们需要的,不仅仅是一个服务注册中心而已,而是一个高可用服务注册中心. 上篇博客中我们介绍了如何使用Spring Cloud搭建一个服务注册中心,但是搭建好的服务注册中心是一个单节点的服务注册中心,这 ...
- Python学习一|anaconda的安装问题以及Python语言的特点
安装时遇到的问题 安装anaconda3.0到D盘之后,配置好两个环境变量:D:\anaconda和D:\anaconda\Scripts.发现在命令行中执行python指令可以,但conda指令却是 ...
- iOS 中 h5 页面 iframe 调用高度自扩展问题及解决
开发需求需要在 h5 中用 iframe 中调用一个其他公司开发的 html 页面. 简单的插入 <iframe /> 并设置宽高后,发现在 Android 手机浏览器上打开可以正常运行, ...
- sass和scss相关知识
参考地址:http://www.imooc.com/learn/311 什么是css预处理器? CSS 预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为 CSS 增加了一些编程的特性 ...
- PHP 与redis 操作添加处理投票
<?php header("Content-Type:text/html;charset=utf-8"); include 'lib/mysql.class.php'; $m ...
- 11 个最佳 jQuery 模拟滚动条插件 scrollbar
1. Windows:全屏窗口滚动插件 该插件可以很好地实现全屏滚动,每滚动一次即为一屏.比如,用户浏览下一屏幕内容时,只需手动滚动到某一位置,该插件会自动滚动显示下一屏全部内容.对于浏览类似于PP ...
- Git(四)Git的分支管理
一. 创建合并分支原理 在我们每次的提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD指针严格来说不是指 ...
- 【AtCoder】AGC021
A - Digit Sum 2 从高位到低位数的第i位以前前缀都相同,第i位比当前位上的数小1的情况下,后面都填9 枚举一下然后计算最大的就好 #include <bits/stdc++.h&g ...
- P1855 榨取kkksc03 二维费用背包
Kkksc03的时间和金钱是有限的,所以他很难满足所有同学的愿望.所以他想知道在自己的能力范围内,最多可以完成多少同学的愿望? 输入输出格式 输入格式: 第一行,n M T,表示一共有n(n<= ...