cef本地服务器加载网页,cef的一些使用方法

cef中提供了一个内置的chome浏览器,对于C/S中使用B/S的方法提供了很大帮助,.net中 自带的webbrowser对IE浏览器有要求,如果客户端的IE版本较低,对于jquery中的方法部分不支持,所以cef就成为了B/S开发C/S的一个利器。

由于项目.net版本原因,用到的是CefSharp-cefsharp-47版本。

一 CEF环境搭建 具体的搭建过程就不多说了,网上都有教程,搜一搜就出来了

下载cef源码后,发现example下的dll有很多个,在网上查了资料后整理了一个大概项目中引用需要的dll文件

1) libcef.dll

2) icudtl.dat

3) devtools_resources.pak(这个必须要的,如果没有的话,页面上会出现好多类似代码的东西)

4) CefSharp.WinForms.dll

5) CefSharp.dll

6) CefSharp.Core.dll

7) CefSharp.BrowserSubprocess.exe

8) CefSharp.BrowserSubprocess.Core.dll

9) locales文件夹下的东西(都是类似于字符集编码的东西) 10)一些pak文件(这些文件是用来控制cef中的样式文件,如cef_100_percent.pak这个如果没有的话,html中的width=100%在窗体最大化的时候就不起作用)

CEF代码编写

1 简单的展现页面

ChromiumWebBrowserm_chromeBrowser =null;

m_chromeBrowser= newChromiumWebBrowser("www.baidu.com");

注意ChromiumWebBrowser的构造方法只有一个,必须传入一个url,如果不需要就传""就行

load函数只能加载url,html串不行,得用下面的loadhtml

2 直接加载html串

m_chromeBrowser.LoadHtml(htmlStr);

注意,这里的LoadHtml是采用的C#中的扩展方法写的。所谓的C#扩展方法就是相当于C#的一个语法炮弹,就是普通的静态类静态方法,需要把对象传入的。

这里必须usingCefSharp;usingCefSharp.WinForms;如果只using了CefSharp.WinForms,那么new出来的ChromiumWebBrowser对象只能.出来Load方法,所有的扩展方法如LoadHtml都是无法点出来的。

m_chromeBrowser.LoadHtml("Helloworld","http://customrendering/");

两个参数,前面的那个是要显示在界面上的,后面的网址的作用暂时还没研究出来,应该是如果有服务器端的话,拼接服务器端的地址的(由于项目中并不是传统的服务器端模式,而是每个终端都是服务器加客户端 的模式,所以暂时没有研究,希望 大神指导下)

注意:网址的一定不能写成"",要不然会报错,直接程序就挂了,好像www.开头的也不行,只能用http://开头的网址用

3 执行提交类的操作(还没调研是否是异步的,好像都是同步的)

1 html肯定是该咋写咋写了,主要是js,例如:

function test1()

{

varresult = winformObj.someFunction();

aler(result);

}

其中winformObj这个对象是由C#中定义的,所以就相当于这里用了js然后执行了一个C#的对象的方法。

2 定义winformObj

publicclassJavaScriptInteractionObj

{

[JavascriptIgnore](这个标签是cef自带的,现在还不知道有啥用)

publicChromiumWebBrowserm_chromeBrowser {get;set;}

[JavascriptIgnore]

publicvoidSetChromeBrowser(ChromiumWebBrowserb)

{

m_chromeBrowser = b;

}

//对应着js中调用的那个方法名称

public string someFunction(){

//...................

}

}

3绑定对象(这个不是在JavaScriptInteractionObj类中,而是C#客户端中用到的页面进行绑定的)

m_jsInteractionObj = newJavaScriptInteractionObj();

m_jsInteractionObj.SetChromeBrowser(m_chromeBrowser);

// Register the JavaScriptInteractionObj class withJS

m_chromeBrowser.RegisterJsObject("winformObj",m_jsInteractionObj);

4 C#代码中执行js脚(这个是网上下的教程中的,忘了是哪个大神些的了,就直接拿过来用 了)

方式1. ExecuteScriptAsync方法使用方式与 js 的 eval方法一样,异步执行,无返回值

// xxx为js的方法名称

wb.ExecuteScriptAsync("xxx()");

// 为 js 的变量jsVar赋值 'abc'

wb.ExecuteScriptAsync("jsVar='abc'");

(但为毛只能将js传入到webbrowser中呢,难道不能直接调用吗?加载的时候应该已经加载到了js了啊,难道没加载到js?貌似找不到相对路径哎,必须得弄成绝对路径,要不找不到

)

方式2.EvaluateScriptAsync 方法使用方式与 js 的 eval方法一样,异步执行,有返回值。

Taskt =wb.EvaluateScriptAsync("callTest2()");

// 等待js 方法执行完后,获取返回值

t.Wait();

// t.Result 是 CefSharp.JavascriptResponse 对象

// t.Result.Result 是一个 object 对象,来自js的 callTest2() 方法的返回值

if(t.Result.Result != null)

{

MessageBox.Show(t.Result.Result.ToString());

}

执行一段js脚本

m_chromeBrowser.LoadHtml("Helloworld","http://customrendering/");

varscript ="document.body.style.backgroundColor = 'red';";

m_chromeBrowser.ExecuteScriptAsync(script);

调用一段js方法的内容

m_chromeBrowser.LoadHtml("Helloworld","http://customrendering/");

StringBuildersb =newStringBuilder();

sb.AppendLine("function tempFunction() {");

sb.AppendLine("var w = window.innerWidth;");

sb.AppendLine("var h = window.innerHeight;");

sb.AppendLine("");

sb.AppendLine("return w*h;");

sb.AppendLine("}");

sb.AppendLine("tempFunction();");

vartask = m_chromeBrowser.EvaluateScriptAsync(sb.ToString());

task.ContinueWith(t =>

{

if(!t.IsFaulted)

{

varresponse = t.Result;

if( response.Success ==true)

{

MessageBox.Show( response.Result.ToString() );

}

}

}, TaskScheduler.FromCurrentSynchronizationContext());

demo2

//Step 01: create a simple html page (include jquery so we have access to jsonobject

StringBuilderhtmlPage =newStringBuilder();

htmlPage.AppendLine("");

htmlPage.AppendLine("");

htmlPage.AppendLine("

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 CefSharp 的 LoadHandler 来检测网页是否加载完成。在 LoadHandler 中,您可以使用 OnLoadEnd 方法来确定页面是否已经加载完毕。一旦页面加载完成,您可以调用 CefSharp 的截图 API 来获取当前页面的截图。 以下是一个示例代码,展示如何使用 CefSharp 来检测页面是否加载完成并获取页面截图: ``` using CefSharp; using CefSharp.WinForms; using System; using System.Drawing; using System.Threading.Tasks; namespace CefSharpScreenshotExample { public class ScreenshotExample { private ChromiumWebBrowser browser; public void Start() { // 初始化 CefSharp Cef.Initialize(new CefSettings()); // 创建 ChromiumWebBrowser 实例 browser = new ChromiumWebBrowser("https://www.example.com"); // 注册 LoadHandler 以处理页面加载事件 browser.LoadingStateChanged += OnLoadingStateChanged; // 等待浏览器窗口加载完成 browser.HandleCreated += async (sender, e) => { await WaitForBrowserToInitialize(); await CaptureScreenshot(); }; } private async Task WaitForBrowserToInitialize() { // 等待浏览器窗口加载完成,这通常需要一些时间 while (!browser.IsBrowserInitialized) { await Task.Delay(100); } } private async Task OnLoadingStateChanged(object sender, LoadingStateChangedEventArgs e) { // 页面加载完成时,获取截图 if (!e.IsLoading) { await CaptureScreenshot(); } } private async Task CaptureScreenshot() { // 等待页面加载完成 await Task.Delay(1000); // 获取页面截图 var bitmap = await browser.ScreenshotAsync(); // 保存截图到本地文件 bitmap.Save("screenshot.png"); // 显示截图 ShowScreenshot(bitmap); } private void ShowScreenshot(Bitmap bitmap) { // 在 UI 线程中显示截图 browser.Invoke(new Action(() => { var form = new Form(); form.BackgroundImage = bitmap; form.ClientSize = bitmap.Size; form.FormBorderStyle = FormBorderStyle.FixedSingle; form.StartPosition = FormStartPosition.CenterScreen; form.Show(); })); } } } ``` 请注意,上述代码中使用了异步方法,因此需要在 C# 5.0 或更高版本中使用 async/await 功能。另外,截图操作需要在 UI 线程中进行,因此需要使用 Invoke 方法来切换到 UI 线程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值