大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
在上一篇博文《WinForm内置浏览器之CefSharp 笔记一》,简单介绍了CefSharp的快速入门。这篇博文接着上篇,主要记录C#如果调用JS中的方法。
本文主要参照Github示例:传送门
CefSharp学习笔记
加载自定义网页
- 修改网址,使用ChromiumWebBrowser类的
Load
方法,直接直接输入网址,也可以加载本地的html文件。
m_chromeBrowser.Load(“https://www.baidu.com”);
- 加载自定义html,使用ChromiumWebBrowser类的
LoadHtml
方法。
m_chromeBrowser.LoadHtml("<html><body>Hello world</body></html>", "http://customrendering/");
JavaScript调用执行C#中的类
这块主要调用ChromiumWebBrowser类的RegisterJsObject
方法,示例如下:(CefCustomObject(chromeBrowse是一个自定义类,可以在上一篇文章中找到)
chromeBrowser.RegisterJsObject("cefCustomObject", new CefCustomObject(chromeBrowser, this));
C#调用执行JavaScript脚本
这块主要调用ChromiumWebBrowser类的ExecuteScriptAsync
方法,示例如下:
private void buttonExecJavaScriptFromWinforms_Click(object sender, EventArgs e)
{
m_chromeBrowser.LoadHtml("<html><body>Hello world</body></html>", "http://customrendering/");
var script = "document.body.style.backgroundColor = 'red';";
m_chromeBrowser.ExecuteScriptAsync(script);
}
还可以这样执行调用:
browser.GetMainFrame().ExecuteJavaScriptAsync(script);
这块可能会遇到这个问题Browser is not yet initialized. Use the IsBrowserInitializedChanged event and check the IsBrowserInitialized property to determine when the browser has been intialized.
官方建议调用方式:参考链接,
这块我使用的ExecuteScriptAsyncWhenPageLoaded
方法执行脚本来避免上面的问题。
C#调用JavaScript,并获取返回的结果
这块因为是异步执行的,所以要获取结果要参考下面这种方式
private void buttonReturnDataFromJavaScript_Click(object sender, EventArgs e)
{
m_chromeBrowser.LoadHtml("<html><body>Hello world</body></html>", "http://customrendering/");
StringBuilder sb = new StringBuilder();
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();");
var task = m_chromeBrowser.EvaluateScriptAsync(sb.ToString());
task.ContinueWith(t =>
{
if (!t.IsFaulted)
{
var response = t.Result;
if ( response.Success == true )
{
MessageBox.Show( response.Result.ToString() );
}
}
}, TaskScheduler.FromCurrentSynchronizationContext());
}
屏蔽浏览器的右键菜单
新建MenuHandler类
public class MenuHandler : CefSharp.IContextMenuHandler
{
void CefSharp.IContextMenuHandler.OnBeforeContextMenu(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.IMenuModel model)
{
model.Clear();
}
bool CefSharp.IContextMenuHandler.OnContextMenuCommand(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.CefMenuCommand commandId, CefSharp.CefEventFlags eventFlags)
{
//throw new NotImplementedException();
return false;
}
void CefSharp.IContextMenuHandler.OnContextMenuDismissed(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame)
{
//throw new NotImplementedException();
}
bool CefSharp.IContextMenuHandler.RunContextMenu(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.IMenuModel model, CefSharp.IRunContextMenuCallback callback)
{
return false;
}
}
设置ChromiumWebBrowser对象的MenuHandler
属性,即可屏蔽右键菜单
m_chromeBrowser = new ChromiumWebBrowser(page);
//屏蔽右键菜单
m_chromeBrowser.MenuHandler = new MenuHandler();
推荐资源:
- CefSharp初识–把网页移到桌面(我觉得还不错,感兴趣的可以看一下)
- Frequently asked questions(常见问题)
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/191849.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...