转载地址: https://www.cnblogs.com/lonelyxmas/p/11010018.html

winform嵌入chrome浏览器,修改项目属性 生成 平台为x86

1.nuget安装cefsharp

2.实例化浏览器

ChromiumWebBrowser b;

private void Form1_Load(object sender, EventArgs e)
{

CefSettings settings = new CefSettings();
settings.CefCommandLineArgs.Add("--disable-web-security","1");//关闭同源策略,允许跨域
settings.CefCommandLineArgs.Add("ppapi-flash-version", "18.0.0.209");//PepperFlash\manifest.json中的version
settings.CefCommandLineArgs.Add("ppapi-flash-path", "PepperFlash\\pepflashplayer.dll");
settings.CefCommandLineArgs.Add("--enable-system-flash", "1");//使用系统flash
Cef.Initialize(settings);

/*以上设置未测试是否可行*/

b = new ChromiumWebBrowser("http://localhost:57531/views/Map/scene.html");
this.Controls.Add(b);
b.Dock = DockStyle.Fill;
b.KeyboardHandler = new CEFKeyBoardHander();
}

3.响应F12打开控制台console

  public class KeyBoardHander : IKeyboardHandler
{
public bool OnKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode,
int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey)
{
if (type == KeyType.KeyUp && Enum.IsDefined(typeof(Keys), windowsKeyCode))
{
var key = (Keys)windowsKeyCode;
switch (key)
{
case Keys.F12:
browser.ShowDevTools();
break; case Keys.F5: if (modifiers == CefEventFlags.ControlDown)
{
//MessageBox.Show("ctrl+f5");
browser.Reload(true); //强制忽略缓存 }
else
{
//MessageBox.Show("f5");
browser.Reload();
}
break; }
}
return false;
}
public bool OnPreKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut)
{
return false;
const int VK_F5 = 0x74;
if (windowsKeyCode == VK_F5)
{
browser.Reload(); //此处可以添加想要实现的代码段
}
return false;
}
}

3.js调用c#方法

public class JsCallMethods
{
public string Test(string msg)
{
return "Return value:" + msg;

/*如果此处要操作winform界面相关的,则需要使用beginInvoke将请求封送至winform主线程中,定义一个全局静态的主窗口类实例  public static Form1 MainForm;主窗体的load事件中MainForm=this;否则会报错:System.InvalidOperationException:“线程间操作无效: 从不是创建控件“Form1”的线程访问它。” 如果要在BeginInvoke之后返回值给前台请使用Invoke代替beginInvoke或者在返回值之前使用EndInvoke函数.

Form1.MainForm.BeginInvoke(new Action(()=> {
var frm = new XXWindow();
frm.Show();

/*Invoke之后返回值得情况示例*/

var str = "";

//Form1.MainForm.Invoke(...);
var iresult=Form1.MainForm.BeginInvoke(new Action(() =>
{
if (frm != null && !frm.IsDisposed)
{
str=frm.PlayByIndex(index,brand,ip,port,user,pwd,channel,isMainStream);

}
else
{
str= "播放窗口未实例化.";
Thread.Sleep(3000); //阻塞3s,后返回值给前台
}
}));
////while (!iresult.AsyncWaitHandle.WaitOne(-1, false))
////{
//// Console.Write("*");
////}
var obj=Form1.MainForm.EndInvoke(iresult);
return str;

*/

}));

}
}

将以下代码加载Cef.Initialize(settings)之后

CefSharpSettings.LegacyJavascriptBindingEnabled = true;//新cefsharp绑定需要优先申明

browser.RegisterAsyncJsObject("MainForm", new JsCallMethods(), new CefSharp.BindingOptions() { CamelCaseJavascriptNames = false });
Cef.AddCrossOriginWhitelistEntry("*", "http", "*", true);

js调用并获取返回值:

var promise = MainForm.Test("123");
promise.then(function (v) {

alert(v);
})

3.2下载文件

public void Download(string path)
{
try
{
HttpDownloadFile(path, Application.StartupPath, true, (fileName, contenType, bytes, totalLength, streamLength) =>
{
System.Diagnostics.Process.Start(fileName);
});
}
catch (Exception ex)
{
MessageBox.Show("操作失败:"+ex.Message);
}
}

/// <summary>
/// 文件下载
/// </summary>
/// <param name="url">所下载的路径</param>
/// <param name="path">本地保存的路径</param>
/// <param name="overwrite">当本地路径存在同名文件时是否覆盖</param>
/// <param name="callback">实时状态回掉函数</param>
/// Action<文件名,文件的二进制, 文件大小, 当前已上传大小>
public static void HttpDownloadFile(string url, string path, bool overwrite, Action<string, string, byte[], long, long> callback = null)
{
// 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
//发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//获取文件名
string fileName = response.Headers["Content-Disposition"];//attachment;filename=FileName.txt
string contentType = response.Headers["Content-Type"];//attachment;

if (string.IsNullOrEmpty(fileName))
fileName = response.ResponseUri.Segments[response.ResponseUri.Segments.Length - 1];
else
fileName = fileName.Remove(0, fileName.IndexOf("filename=") + 9);

fileName = HttpUtility.UrlDecode(fileName);
//直到request.GetResponse()程序才开始向目标网页发送Post请求
using (Stream responseStream = response.GetResponseStream())
{
long totalLength = response.ContentLength;
///文件byte形式
byte[] b =new byte[totalLength];
//创建本地文件写入流
if (System.IO.File.Exists(Path.Combine(path, fileName)))
{
fileName = DateTime.Now.Ticks + "-"+fileName ;
}
var fullPath = Path.Combine(path + "\\downloads", fileName);
using (Stream stream = new FileStream(fullPath, overwrite ? FileMode.Create : FileMode.CreateNew))
{
byte[] bArr = new byte[1024];
int size;
while ((size = responseStream.Read(bArr, 0, bArr.Length)) > 0)
{
stream.Write(bArr, 0, size);

}
}
callback.Invoke(fullPath, contentType, b, totalLength, 0);
}
}

js调用

 MainForm.Download("http://192.168.18.199/test.xls");

4.c#调用js方法

function jsMethod(param) {
alert("jsMethod called param is :" + param);
}

C#调用

b.ExecuteScriptAsync("jsMethod(123)");

From: https://www.cnblogs.com/xuejianxiyang/p/9981398.html

CefSharp F12打开DevTools查看console js和c#方法互相调用的更多相关文章

  1. CefSharp F12打开DevTools查看console

    winform嵌入chrome浏览器,修改项目属性 生成 平台为x86 1.nuget安装cefsharp 2.实例化浏览器 private void Form1_Load(object sender ...

  2. JS和C#方法相互调用

    JS和C#方法相互调用 1.JS调用C#后台方法 方法一: 1.首先建立一个按钮,在后台将调用或处理的内容写入button_click中;2.在前台写一个js函数,内容为document.getEle ...

  3. 转载 -- 基于原生JS与OC方法互相调用并传值(附HTML代码)

    最近项目里面有有个商品活动界面,要与web端传值,将用户在网页点击的商品id 传给客户端,也就是js交互,其实再说明白一点就是方法的互相调用而已. 本文叙述下如何进行原生的JavaScript交互 本 ...

  4. JS如何定义方法及调用 精选

    简单搜索了下,遇到点问题1,经常在JS中看到如var foo = function(){}的形式foo是方法名还是对象名,如果想调用此方法,是用foo(),foo.function(),还是该如何正确 ...

  5. 给你的站点加入 console.js

    本文仅先给使用console调试的FE同学,假设你还不知道console是什么.或者还停留在alert阶段,那就不要浪费时间了,say bay bay! 你是否试程序的过程中用过console.log ...

  6. 给你的网站添加 console.js

    本文仅先给使用console调试的FE同学,如果你还不知道console是什么,或者还停留在alert阶段,那就不要浪费时间了,say bay bay! 你是否试程序的过程中用过console.log ...

  7. ReactNative调用aar文件(附:如何打开、查看aar文件内容)

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7275897.html ReactNative可以用来进行一些嵌入式设备的操作终端开发,比如:ATM机.自动售卖 ...

  8. 使用CEfSharp之旅(2) js前台事件执行后台方法

    原文:使用CEfSharp之旅(2) js前台事件执行后台方法 版权声明:本文为博主原创文章,未经博主允许不得转载.可点击关注博主 ,不明白的进群191065815 我的群里问 https://blo ...

  9. console.js还有浏览器不支持?

    今天看到项目中引入了一个插件,我超级惊讶 为什么引入console.js啊? 这个是插件的源码:https://github.com/yanhaijing/console.js 我搜到源作者对这个插件 ...

随机推荐

  1. Linux性能分析——分析系统性能相关的命令

    Linux性能分析——分析系统性能相关的命令 摘要:本文主要学习了Linux系统中分析性能相关的命令. ps命令 ps命令用来显示系统中进程的运行情况,显示的是当前系统的快照. 基本语法 ps [选项 ...

  2. Windows Store可以下载安装Windows Terminal (Preview)

    Windows Terminal (Preview)已经可以在Windows Store下载安装. Windows Terminal (Preview)运行要求为: Windows 10 版本 183 ...

  3. 1-函数返回值-return详解及应用-1

    return 返回值   可以是:数字.字符串.布尔.函数.对象(元素\[]\{}\null).未定义  <script> function fn1(){return 100;} aler ...

  4. Microsoft Office自制安装指南 —Nusen_Liu

    Microsoft Word 2010 正版下载安装步骤 版权来自:Nusen_Liu 1.   解压文件(推荐解压到当前文件夹,大神也可以自定义的)下载地址在第16步 (*^__^*) 2.   解 ...

  5. linux rz sz文件传输 ZModem协议

    比ftp和scp方便点.需要用支持ZModem协议的工具,SecureCRT是可以的 rz: 接收文件 sz: 发送文件 安装 # sudo apt-get install lrzsz 使用 协议介绍 ...

  6. 仅用StoryBoard布局实现按钮的均匀分布

    今天在做登录界面时设计的需求是,登录和取消按钮左右对称均匀分布,按钮大小不变如图 屏幕宽度变化时按钮宽度不变,三个间距相等并且随屏幕变化而变化,简单的说就是按钮均匀分布,在网上查了一些资料,弄得比较乱 ...

  7. Redis主从复制机制详解

    Redis主从复制机制详解 Redis有两种不同的持久化方式,Redis服务器通过持久化,把Redis内存中持久化到硬盘当中,当Redis宕机时,我们重启Redis服务器时,可以由RDB文件或AOF文 ...

  8. nRF24L01+如何检测信道被占用-RSSI寄存器实战分享

    检测信道占用的需求场景 在使用nRF24L01模块做一对多或多对一的组网通信中,大家都会担心一个问题就是在发送的时候,希望不要有其他的模块也进行发送,因为这样就会使无线信号发生碰撞,信道被堵塞,造成通 ...

  9. [b0033] python 归纳 (十八)_队列Queue在多线程中使用(二)

    # -*- coding: UTF-8 -*- """ 多线程同时读队列 使用 join(), task_done() 逻辑: 3个子线程并发 从有6个数据的队列中取数据 ...

  10. liteos 异常接管(十五)

    1 概述 1.1 基本概念 异常接管是操作系统对在运行期间发生异常的情况进行处理的一系列动作,譬如打印异常发生时当前函数调用栈信息. cpu现场信息.任务的堆栈情况等. 异常接管作为一种调测手段,可以 ...