winform嵌入chrome浏览器,修改项目属性 生成 平台为x86web
1.nuget安装cefsharp
2.实例化浏览器
ChromiumWebBrowser b;chrome
private void Form1_Load(object sender, EventArgs e) {json
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);c#
/*以上设置未测试是否可行*/windows
b = new ChromiumWebBrowser("http://localhost:57531/views/Map/scene.html"); this.Controls.Add(b); b.Dock = DockStyle.Fill; b.KeyboardHandler = new CEFKeyBoardHander(); }api
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函数.promise
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
|