我刚学习C#WPF并且已经成功实现了CefSharp,如何从javascript中调用.NET函数,这是在CefSharp中加载的?
我是CefSharp的新手.上周我在C#中使用CefSharp构建了我的第一个小程序.这是一个分屏程序.在一个分区我加载了Tweetdeck.它工作正常,但Tweetdeck不存储cookie.每次我启动程序时,我都必须登录.有没有办法保存cookie?
var browser1 = new CefSharp.WinForms.ChromiumWebBrowser("https://tweetdeck.twitter.com/")
{
Dock = DockStyle.Fill,
};
splitContainer1.Panel1.Controls.Add(browser1);
Run Code Online (Sandbox Code Playgroud) 我在Winform中创建了一个CefSharp浏览器,我需要在内存中动态构建一个HTML页面,然后让CefSharp渲染它.
理想情况下,我想在构造函数中传递一个包含HTML的字符串,但它需要一个URL.答案可能是否定的,但是有一个指令可以预先添加字符串让CefSharp知道它是一个包含网页的字符串吗?然后CefSharp会创建一个临时文件?
如果没有,Chromium临时文件夹设置为何处?如果我将文件写入那里然后将其作为完全限定的路径传递,它会工作吗?我知道Chrome会支持像file:///Users/dmacdonald/Documents/myFile.htm这样的URL,但是如果使用临时结构则不知道如何形成URL.
这是我的新代码,但我的浏览器对象没有ResourceHandler属性.我看到它有一个ResourceHandlerFactory
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using CefSharp.WinForms;
using CefSharp;
namespace DanCefWinForm
{
public partial class Form1 : Form
{
public const string TestResourceUrl = "http://maps/resource/load";
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
ChromiumWebBrowser browser = new ChromiumWebBrowser("http://maps/resource/load")
{
Dock = DockStyle.Fill,
};
var handler = browser.ResourceHandler;
browser.Location = new Point(20, 20);
browser.Size = new Size(100, 100);
this.Controls.Add(browser);
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用cefsharp winforms从我的应用程序下载一些文件(图像,文件音频或其他内容).我读了其他任何帖子,但似乎没什么用.你有没有示例代码向我展示如何实现cefsharp的下载程序?
当然,当我现在尝试下载一些文件时,没有任何反应.
谢谢
每当我尝试使用CefSharp(Stable 57.0)通过C#执行JavaScript时,我都会收到错误消息.我只是尝试执行警报功能,所以我可以确保它可以工作,然后用我自己的函数测试它.但是,我似乎在尝试这样做时遇到错误.
public partial class WebBrowserWindow : Window
{
public WebBrowserWindow()
{
InitializeComponent();
webBrowser.MenuHandler = new ContextMenuHandler();
webBrowser.RequestHandler = new RequestHandler();
}
//Trying to execute this with either method gives me an error.
public void ExecuteJavaScript()
{
//webBrowser.GetMainFrame().ExecuteJavaScriptAsync("alert('test')");
//webBrowser.ExecuteScriptAsync("alert('test');");
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试了两种执行脚本的方法.
第一个:
webBrowser.GetMainFrame().ExecuteJavaScriptAsync("alert('test')");
Run Code Online (Sandbox Code Playgroud)
给我这个错误:
第二:
webBrowser.ExecuteScriptAsync("alert('test');");
Run Code Online (Sandbox Code Playgroud)
给我这个错误:
我的目标是创建一个可以在我的CefSharp浏览器中执行JavaScript函数的C#函数.
我尝试了很多链接/引用,堆栈溢出并没有那么多.我还阅读了CefSharp的FAQ,找不到任何允许我通过C#随意执行JavaScript的简单示例.
另外,我已经验证了加载Frame的事件(它完成加载)和卸载(它没有卸载),如果webbrowser为null(它不是),以及来自:的消息:
webBrowser.GetMainFrame().ExecuteJavaScriptAsync("alert('test')");
Run Code Online (Sandbox Code Playgroud)
仍会导致第一个错误发生.
我测试了GetMainFrame().它总是返回null.总是.无论我等待多久,或者我检查的条件.
重要
我忘记添加一条关键信息,我的项目中有2个程序集.它们都编译成单独的可执行文件:
Helper.exe Main.exe
main.exe有一个窗口"CallUI",当单击一个按钮时,它会执行我创建的"ExecuteJavaScript()"方法,它位于我的窗口"BrowserWindow"中.CallUI窗口在Helper.exe中声明并初始化.
所以基本上我试图使用单独的程序打开一个窗口,单击一个调用该方法并执行javascript的按钮.所以我认为因为它们是不同的进程,它告诉我浏览器是null.但是,当我在Main.exe中完成所有操作时,它可以正常工作.是否有一种解决方法允许我使用单独的进程从Helper.exe创建窗口并从Main.exe执行Javascript?
我们在WinForm(CefSharp控件)中有一个控件,当用户屏幕在Windows上设置为125%时,它会受到图形工件的影响.它不仅仅是控制,独立Chrome在某种程度上做到了.我们能够修复工件的唯一方法是更改下图所示的exe设置.有没有办法在代码中更改它?
编辑:这不是重复.制作应用程序DPI意识与DPI缩放不一样
我是CefSharp的新手我已经创建了一个类库项目并引用了CefSharp库来呈现Web浏览器,但是我遇到了一些显示Web浏览器的问题.请找到确切的代码
WebBrowser_test1:
public partial class ChildWidget : Window
{
public CefSharp.Wpf.ChromiumWebBrowser webView;
public Widget()
{
InitializeComponent();
CefSharp.CefSettings settings = new CefSharp.CefSettings();
settings.PackLoadingDisabled = true;
if (CefSharp.Cef.Initialize(settings))
{
webView = new CefSharp.Wpf.ChromiumWebBrowser();
main_grid.Children.Add(webView);
webView.Address = "http://www.google.co.uk";
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在另一个项目中引用了这个库(dll)
public MainWindow()
{
InitializeComponent();
Button newbutton = new Button();
newbutton.Width = 50;
main_grid.Children.Add(newbutton);
newbutton.Click += ButtonClick;
}
private void ButtonClick(object sender, RoutedEventArgs e)
{
try
{
Webbrowser_test1.ChildWidget childWidget = new Widget();
childWidget.Show();
}
catch (Exception)
{
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
现在点击按钮,我将打开(WebBrowser_test1)子窗口小部件,我将在其中显示Web浏览器..当窗口打开时,它显示为空白.
如果我遗漏任何东西,请告诉我
对于我正在处理的项目,我需要在任何网页文档处理开始之前注入javascript.这可以通过WebBrowser组件轻松实现,但我在使用CefSharp时遇到了困难.
这是问题的简化,网页需要"InjectedObject"才能运行.在文档的最顶部调用未注入的网页,或者在处理文档之前进行评估/执行将导致:
===== html示例输出失败=====
isObjectPresent?
假
=====
我需要在哪里显示网页:
===== html示例输出成功=====
isObjectPresent?
真正
=====
<html>
<head>
<script>
isObjectPresent = typeof InjectedObject == "object";
</script>
</head>
<body>
<p>isObjectPresent?</p>
<div id="result"></div>
<script>
document.getElementById("result").innerHTML = isObjectPresent;
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
查看所有可用的建议将表明我应该使用LoadingStateChanged()或FrameLoadEnd()来注入脚本,即:
public void OnFrameLoadEnd(object sender, FrameLoadEndEventArgs args) {
if (args.Frame.IsMain) {
args.Frame.ExecuteJavascriptAsync("window.InjectedObject = {};");
}
}
Run Code Online (Sandbox Code Playgroud)
然而,我尝试过的所有迭代,甚至使用FrameLoadStart,都导致在文档开始处理后出现插入的javascript.是否有任何真正的javascript注入示例确保它在文档处理开始之前发生.(确保避免竞争条件/时间问题).
作为我想模仿的WebBrowser组件行为的一个例子是:
private void uiWebBrowser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
var browser = (WebBrowser)sender;
var document = browser.Document as HTMLDocument;
var head = document.getElementsByTagName("head").Cast<HTMLHeadElement>().First();
if (head != null)
{
var …Run Code Online (Sandbox Code Playgroud) 我想获取当前地址并将其放入文本框中。我找到了这个链接,但似乎无法理解任何内容。
http://cefsharp.github.io/api/57.0.0/html/P_CefSharp_WinForms_ChromiumWebBrowser_Address.htm
我真的很感激某人的代码片段。这太痛苦了。我正在使用WFA。
首先,我是C#的新手并且学习Cefsharp + javascript,所以请尝试评论你认为必要的任何解决方案,这将拯救我提出愚蠢的问题.
我试图等到页面完成加载Cefsharp来执行我的代码,我已经尝试了在其他stackoverflow问题/ github上找到的几个解决方案,但没有去...
我认为解决方案是"NavStateChanged",但我得到一个C#错误:"ChromiumWebBrowser不包含'NavStateChanged'的定义"
任何人都可以指出我正确的方向或给我一个片段?我不是要求你为我写完整件事,但我真的迷失在这里,我一下子学习C#,Cefsharp和javascript,而且......压倒性的.
这是我在网上寻找解决方案时找到的代码,它也匹配了很多github引用,但似乎不起作用:/
EventHandler<NavStateChangedEventArgs> handler = null;
handler = (sender, args) = > {
//TODO : show a loading gif until the page load completes
//Wait for while page to finish loading not just the first frame
if (!args.IsLoading)
{
chromeBrowser.NavStateChanged -= handler;
MessageBox.Show("The page has completed loading", "Load completed",
MessageBoxButtons.OK);
//TODO : once load complete show the actual page
}
Run Code Online (Sandbox Code Playgroud)