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 CEFKeyBoardHander : IKeyboardHandler
{//https://bbs.csdn.net/topics/392375553
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;
}
}
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);
}
}
MainForm.Download("http://192.168.18.199/test.xls");
winform嵌入chrome浏览器,修改项目属性 生成 平台为x861.nuget安装cefsharp2.实例化浏览器ChromiumWebBrowser b;private void Form1_Load(object sender, EventArgs e) { CefSettings settings = new CefSettings(); ...
nuget安装
cefsharp
打开
NuGet 程序包管理器控制台:工具=>NuGet 程序包管理器=》程序包管理器控制台。搜索
CefSharp
.WinForm,选择版本和需要添加的项目,安装后会将所有需要的文件加入选择的项目中,并且将dll文件加入引入。
将平台换为X86或者X64,Any Cpu无法编译成功
实例化浏览器
响应F12
打开
控制台
console
c#
调用
js
方法
(function () {
function getScript(url, success) {
var script = document.createElement('script');
script.src = url;
var head = document.getElementsByTagName('head')[0],
done = false;
script.onload = script.on.
本章节介绍CefSetting各种设置CefExample.Init(osr: false, multiThreadedMessageLoop: multiThreadedMessageLoop, browserProcessHandler: browserProcessHandler);
这个
方法
就是Cef的初始化设置。里面有一些设置是已经注释的,每项设置我也没有详细研究,感兴趣的朋友可以自己看看
Node.
js
6.3+, 这个可上Node.
js
官网自行下载;
Chrome 55+. 如果您本地的chrome升级到最新版后还是<55, 可以从此处下载:Chrome Canary,亲测可行。
就目前来说,在浏览器端并行调试JavaScript与Node.
js
还属于新特性,新体验。为了能够正常使用,你还需要做如下配置:
1、输入url:chrome://flags/#enable-
devtools
-experiments. 注:如果使用中文版Chrome,显示的配置项名称应该为: 开发者工具实验性功能 ,如下图;
2、启用它;
3、重启Chrome;
4、
打开
D
2.使用IE内核
打开
,即浏览器的兼容模式
如果只是想单纯的
打开
普通的H5 使用谷歌内核,Nuget 搜
CefSharp
即可,使用百度就可以了,下面说要使用IE
打开
H5.
现在有一批H5资源比较特殊,交互动画在浏览器里必须以兼容模式
打开
才能使用,这里的矛盾就是webbrower不支持h5,即IE内核
打开
,而兼容模式是IE内核不支持h5
winform 是IE内核不支持H5 一百度都是只有这么一句话,你在winform里试了一下
同源是指相同的协议、域名、端口,三者都相同才属于同域。不符合上述定义的请求,则称为跨域。
相信每个开发人员都曾遇到过跨域请求的情况,虽然情况不一样,但问题的本质都可以归为浏览器出于安全考虑下的同源策略的限制。
跨域的情形有很多,最常见的有Ajax跨域、Socket跨域和Canvas跨域。下面列举一些我们常见的跨域情形下,某些浏览器控制台给出的错误提示。
FireFox下的提示:已阻止交叉源请求:同源策略不允许读取***上的远程资源。可以将资源移动到相同的域名上或者启用 CORS 来解决这个问题。Canvas
### 回答1:
CefSharp
是一个.NET包装器,它提供了对Chromium浏览器的访问。要
调用
javascript获取返回值,可以使用
CefSharp
的ExecuteScriptAsync()
方法
。该
方法
以脚本字符串作为参数,并返回Task类型的结果。这意味着您可以异步
调用
javascript函数,并在
调用
成功后获取返回值。
在执行javascript代码后,您将获取一个JavascriptResponse对象,其中包含执行结果的字符串值和一个布尔值,指示脚本是否成功在浏览器中运行。如果脚本未成功执行,则会提供一个错误消息。
以下是一个简单的示例,它演示了如何使用
CefSharp
执行一个简单的javascript函数并获取返回值:
```csharp
var task = browserControl.ExecuteScriptAsync("document.title");
task.ContinueWith(t =>
if (!t.IsFaulted)
var response = t.Result;
if (response.Success && response.Result != null)
//获取返回值
var result = response.Result.ToString();
MessageBox.Show(result);
else if (!response.Success)
//输出错误消息
MessageBox.Show(response.Message);
}, TaskScheduler.FromCurrentSynchronizationContext());
在这个示例中,我们使用ExecuteScriptAsync()
方法
执行了一个简单的javascript代码(获取页面的标题),并使用ContinueWith()
方法
处理返回值。在ContinueWith()
方法
中,我们检查返回的JavascriptResponse对象是否包含成功的结果,如果是,我们将结果存储在result变量中并显示在一个消息框中。
总之,
CefSharp
可以让我们方便的访问Chromium浏览器的功能,包括执行javascript代码并获取返回值。通过使用.ExecuteScriptAsync()
方法
,我们可以异步执行javascript代码,并在获取结果后轻松处理返回的JavascriptResponse对象。
### 回答2:
cefsharp
是一款基于Chromium开源浏览器的.NET框架,它提供了一种方便的方式来嵌入浏览器引擎到你的应用程序中。如果想要使用
cefsharp
调用
JS
获取返回值,首先需要在.NET平台上使用
C#
编写代码。
我们可以通过
cefsharp
提供的接口获取浏览器引擎对象,然后通过该对象
调用
浏览器引擎中的JavaScript接口。最简单的方式是使用
CEFSharp
.
DevTools
,它提供了一系列的
方法
来处理JavaScript代码并返回结果。例如:
```csharp
using
CefSharp
;
using
CefSharp
.
DevTools
;
using
CefSharp
.
DevTools
.DOM;
var browser = new ChromiumWebBrowser("http://www.google.com");
//等待浏览器加载完成
browser.FrameLoadEnd += (sender, e) =>
if (e.Frame.IsMain)
browser.ExecuteScriptAsync("document.body.style.zoom = \"200%\";");
var dom = browser.GetMainFrame().Get
DevTools
Session();
var result = dom.EvaluateScriptAsync("document.title");
//通过Task异步等待返回结果
result.ContinueWith(task =>
Console
.WriteLine(result.Result.Result.Value);
TaskContinuationOptions.OnlyOnRanToCompletion);
上述代码中,通过Create
DevTools
SessionAsync
方法
获取到
DevTools
Session对象(即浏览器页面的DOM),然后通过EvaluateScriptAsync
方法
执行
JS
代码,最后通过ContinueWith
方法
等待返回结果。在这个例子中,我们通过执行document.title代码,读取了当前页面的标题信息。
需要注意的是,
CEFSharp
.
DevTools
仅在Chrome 63或以上版本中提供支持。如果您要运行旧版本的Chrome,请参考
CEFSharp
.
CefSharp
Extensions来实现类似的JavaScript代码处理。