【CefSharp】常用重要接口解析

IBrowserProcessHandler

在C#中使用CefSharp时,IBrowserProcessHandler 接口用于处理浏览器进程的事件。以下是一个如何实现 IBrowserProcessHandler 接口的示例:

using CefSharp;
public class MyBrowserProcessHandler : IBrowserProcessHandler{
public void OnContextInitialized(){
// 在CEF上下文初始化时执行的代码    
}
public void OnContextReleased(){
// 在CEF上下文释放时执行的代码    
}
public void OnBrowserClosing(IBrowser browser){
// 在浏览器关闭时执行的代码    
}
public void OnBrowserProcessExited(CefTerminationStatus status){
// 在浏览器进程退出时执行的代码    
}
}

要使用这个处理器,你需要在CefSharp的初始化过程中将其设置为浏览器的进程处理器:

CefSharp.Cef.Initialize(new CefSharp.CefSettings(), new MyBrowserProcessHandler());

在实际的应用程序中,你可能需要根据你的具体需求来实现这个接口的方法。这个示例提供了每个方法的基本框架,你可以根据需要添加更多的逻辑。

ILifeSpanHandler

在C#中使用CefSharp库时,ILifeSpanHandler接口用于处理与浏览器窗口的生命周期相关的事件。以下是一个简单的实现了ILifeSpanHandler接口的类示例:

using CefSharp;
 
public class MyLifeSpanHandler : ILifeSpanHandler
{
    public bool DoClose(IWebBrowser browserControl, IBrowser browser)
    {
        // 通常返回false,允许浏览器窗口关闭
        return false;
    }
 
    public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser)
    {
        // 浏览器窗口创建后的回调
    }
 
    public bool OnBeforeClose(IWebBrowser browserControl, IBrowser browser)
    {
        // 浏览器窗口关闭前的回调,通常返回false
        return false;
    }
 
    public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
    {
        // 弹出新窗口前的回调,通常返回true来取消默认行为
        newBrowser = null;
        return true;
    }
}

在实际使用中,你需要将MyLifeSpanHandler的实例设置给CefSharp的Browser对象:

var browser = new ChromiumWebBrowser("http://www.example.com");
browser.LifeSpanHandler = new MyLifeSpanHandler();

这样,当浏览器窗口的生命周期事件发生时,MyLifeSpanHandler中相应的方法就会被调用。

IDownloadHandler

在C#中使用CefSharp库时,你可能需要实现一个IDownloadHandler接口来处理下载事件。以下是一个简单的实现示例:

using CefSharp;
 
public class MyDownloadHandler : IDownloadHandler
{
    public void OnBeforeDownload(IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
    {
        // 在下载之前可以做一些处理,比如修改保存路径等
        // 调用callback.Continue(resultingFileName, showDialog)来继续下载
        callback.Continue(downloadItem.SuggestedFileName, true);
    }
 
    public void OnDownloadUpdated(IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
    {
        // 下载进度更新时会调用这个方法
        // 可以通过downloadItem.PercentComplete获取下载进度
        if (downloadItem.IsComplete)
        {
            // 下载完成时的处理逻辑
        }
    }
}

在你的CefSharp初始化代码中,你需要将这个MyDownloadHandler设置为你的下载处理器:

var settings = new CefSharp.CefSettings();
CefSharp.Cef.Initialize(settings, performDependencyCheck: true, browserProcessHandler: null);
 
var downloadHandler = new MyDownloadHandler();
var requestContextSettings = new CefSharp.RequestContextSettings {
    // 设置你的下载处理器
    DownloadHandler = downloadHandler
};
 
var requestContext = new CefSharp.RequestContext(requestContextSettings);
var browser = new CefSharp.WebBrowser("your_start_url", requestContext: requestContext);

这样,当你的CefSharp浏览器进程中有文件下载时,MyDownloadHandler中的OnBeforeDownloadOnDownloadUpdated方法将会被调用,你可以在这些方法中实现自己的下载逻辑。

IKeyboardHandler

在C#中使用CefSharp时,你可能需要处理键盘事件。为此,你可以实现IKeyboardHandler接口。以下是一个简单的实现示例:

using CefSharp;
 
public class MyKeyboardHandler : IKeyboardHandler
{
    public bool OnKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags cefEventFlags, int modifiers)
    {
        // 你可以在这里处理键盘事件
        // 返回true表示事件被处理,否则返回false
        return false;
    }
 
    public bool OnCharEvent(IWebBrowser browserControl, IBrowser browser, int character, int modifiers, bool isSystemKey)
    {
        // 处理字符输入事件
        // 返回true表示事件被处理,否则返回false
        return false;
    }
}

在你的CefSharp设置中,你需要将这个MyKeyboardHandler设置为你的IKeyboardHandler

var settings = new CefSharp.CefSettings();
settings.KeyboardHandler = new MyKeyboardHandler();
CefSharp.Cef.Initialize(settings);

这样,CefSharp就会在处理键盘事件时调用你的MyKeyboardHandler实现。记得在实际应用中根据需求来填充具体的事件处理逻辑。

IContextMenuHandler

在C#中使用CefSharp库时,你可以通过实现IContextMenuHandler接口来自定义右键上下文菜单。以下是一个简单的实现示例:

using CefSharp;
using CefSharp.Handler;
 
public class MyContextMenuHandler : IContextMenuHandler
{
    public void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model)
    {
        // 可以在这里修改或完全禁用默认的右键菜单项
        // 例如,禁用所有菜单项
        for (int i = 0; i < model.Count; i++)
        {
            model.SetCommandIdAt(i, i);
            model.SetEnabledAt(i, false);
        }
    }
 
    public bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags)
    {
        // 处理右键菜单项的点击事件
        // 返回true表示已处理,否则返回false
        return false;
    }
 
    public void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame)
    {
        // 右键菜单关闭时的回调
    }
 
    public bool RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters)
    {
        // 控制是否显示默认的右键菜单
        // 返回true表示不显示默认菜单,返回false则显示
        return true;
    }
}

要使用这个自定义的IContextMenuHandler,你需要在初始化CefSharp浏览器时设置它:

var browser = new ChromiumWebBrowser("http://example.com");
browser.MenuHandler = new MyContextMenuHandler();

这样,当用户在页面上点击右键时,MyContextMenuHandler中的OnBeforeContextMenu方法将被调用,允许你自定义上下文菜单的显示。在这个示例中,所有的菜单项都被禁用了。你可以根据需要修改这个实现来增加或者移除菜单项,甚至可以完全自定义一个上下文菜单。

IRequestHandler

CefSharp是一个开源的Chromium内核框架,它允许开发者在.NET应用程序中嵌入一个web浏览器。IRequestHandler接口是CefSharp中用于处理浏览器请求的一个重要接口。

以下是一些使用CefSharp的IRequestHandler接口的方法:

  1. 重定向请求:

你可以通过实现IRequestHandler接口的OnBeforeBrowse方法来重定向请求。

public class MyRequestHandler : IRequestHandler
{
    public bool OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, 
        bool userGesture, bool isRedirect)
    {
        if (request.Url.StartsWith("http://www.example.com/"))
        {
            //Redirect to https://www.example.com/
            browser.MainFrame.LoadUrl("https://www.example.com/");
            return true;
        }
        return false;
    }
}
  1. 拦截响应:

你可以通过实现IRequestHandler接口的GetResourceResponseFilter方法来拦截响应。

public class MyRequestHandler : IRequestHandler
{
    public IResourceResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, 
        IFrame frame, IRequest request, IResourceResponse response)
    {
        return new MyResourceResponseFilter();
    }
}
 
public class MyResourceResponseFilter : IResourceResponseFilter
{
    public bool FilterResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, 
        IRequest request, IResponse response)
    {
        //Modify the response data
        return false;
    }
}
  1. 处理请求:

你可以通过实现IRequestHandler接口的GetResourceHandler方法来处理请求。

public class MyRequestHandler : IRequestHandler
{
    public IResourceRequestHandler GetResourceRequestHandler(IWebBrowser browserControl, IBrowser browser, 
        IFrame frame, IRequest request, IResourceType resourceType, string redirectUrl)
    {
        if (request.Url.StartsWith("http://example.com/"))
        {
            //Handle the request manually
            return new MyResourceRequestHandler();
        }
        return null;
    }
}
 
public class MyResourceRequestHandler : IResourceRequestHandler
{
    public CefReturnValue ProcessRequest(IRequest request, ICallback callback)
    {
        //Read the response data and then execute the callback
        return CefReturnValue.Continue;
    }
}
  1. 拦截请求:

你可以通过实现IRequestHandler接口的OnBeforeResourceLoad方法来拦截请求。

public class MyRequestHandler : IRequestHandler
{
    public bool OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, 
        IRequest request, IRequestCallback callback)
    {
        if (request.Url.StartsWith("http://example.com/"))
        {
            //Intercept the request and choose when to continue the load
            return true;
        }
        return false;
    }
}

注意:以上代码只是展示了如何使用CefSharp的IRequestHandler接口处理请求的一部分功能。实际使用时,你需要实现接口中的所有方法,并在创建CefSharp的Browser对象时传入自定义的IRequestHandler实例。

例如,你可以这样使用MyRequestHandler:

var browser = new ChromiumWebBrowser("www.example.com");
browser.RequestHandler = new MyRequestHandler();

以上就是CefSharp中IRequestHandler接口的一些使用方法。

EventArgs

CefSharp是一个开源的.NET库,它提供了一个Chromium内核的Web浏览器,可以在C#和其他.NET语言中使用。

在CefSharp中,有许多事件是可以通过注册事件处理程序来响应的。这些事件处理程序的参数类型就是EventArgs。

例如,如果你想要在页面加载完成后做一些事情,你可能会注册Browser.FrameLoadEnd事件。FrameLoadEnd事件的参数就是CefSharp.CefEventArgs。

browser.FrameLoadEnd += Browser_FrameLoadEnd;
 
private void Browser_FrameLoadEnd(object sender, CefSharp.CefEventArgs e)
{
    // 在这里做你需要的事情
}

如果你想要在页面开始加载时做一些事情,你可能会注册Browser.FrameLoadStart事件。FrameLoadStart事件的参数也是CefSharp.CefEventArgs。

browser.FrameLoadStart += Browser_FrameLoadStart;
 
private void Browser_FrameLoadStart(object sender, CefSharp.CefEventArgs e)
{
    // 在这里做你需要的事情
}

在CefSharp中,有很多事件和它们对应的EventArgs,例如:

  • Browser.FrameLoadStart
  • Browser.FrameLoadEnd
  • Browser.LoadError
  • Browser.AddressChanged
  • Browser.StatusMessage
  • Browser.TitleChanged
  • Browser.IsBrowserInitializedChanged
  • Browser.ConsoleMessage
  • Browser.StatusMessage
  • Browser.LoadingStateChanged
  • Browser.TooltipChanged
  • Browser.BeforeClose
  • Browser.FrameLoadStart
  • Browser.FrameLoadEnd
  • Browser.LoadError
  • Browser.AddressChanged
  • Browser.StatusMessage
  • Browser.TitleChanged
  • Browser.IsBrowserInitializedChanged
  • Browser.ConsoleMessage
  • Browser.StatusMessage
  • Browser.LoadingStateChanged
  • Browser.TooltipChanged
  • Browser.BeforeClose

等等。

这些事件和它们的EventArgs都可以在CefSharp的官方文档中找到。

注意:在使用CefSharp时,你需要在项目中包含CefSharp.WinForms(对于WinForms应用程序)或CefSharp.Wpf(对于WPF应用程序)。

以上就是C# CefSharp EventArgs的一个基本介绍和使用方法。

ICookieVisitor

在C#中使用CefSharp库时,你可能需要遍历或操作Cookies。CefSharp提供了一个接口ICookieVisitor,你可以通过它来访问和操作Cookies。

下面是一个如何使用ICookieVisitor接口的简单示例:

using CefSharp;
using CefSharp.Cookie;
 
public class CookieVisitor : ICookieVisitor
{
    public bool Visit(Cookie cookie, int count, int total, ref bool deleteCookie)
    {
        Console.WriteLine($"Cookie: {cookie.Name} = {cookie.Value}");
        return true; // 继续遍历
    }
 
    public void Dispose()
    {
        // 在这里可以进行清理操作
    }
}
 
// 使用方法:
var cookieVisitor = new CookieVisitor();
var cookieManager = CefSharp.Cef.GetGlobalCookieManager();
cookieManager.VisitAllCookies(cookieVisitor);

在这个示例中,我们创建了一个CookieVisitor类,它实现了ICookieVisitor接口。Visit方法会被调用为每个Cookie。你可以在这里打印出Cookie信息或者进行其他操作。Dispose方法可以用于资源清理。

然后,我们获取全局的ICookieManager,并调用VisitAllCookies方法,传入我们的cookieVisitor实例,开始遍历所有Cookies。

请注意,你需要先添加CefSharp引用到你的项目中,并确保CefSharp已经初始化。

IDisplayHandler

在C#中使用CefSharp库时,IDisplayHandler接口用于处理JavaScript对话框,例如alert、confirm和prompt。以下是一个简单的实现示例:

public class MyDDisplayHandler : CefSharp.IDDisplayHandler
{
    public void OnJavaScriptAlert(IWebBrowser browserControl, IBrowser browser, IFrame frame, string message)
    {
        // 处理alert对话框
        System.Windows.Forms.MessageBox.Show(message, "Alert", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Information);
    }
 
    public bool OnJavaScriptConfirm(IWebBrowser browserControl, IBrowser browser, IFrame frame, string message, out bool response)
    {
        // 处理confirm对话框
        System.Windows.Forms.DialogResult result = System.Windows.Forms.MessageBox.Show(message, "Confirm", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question);
        response = result == System.Windows.Forms.DialogResult.Yes;
        return false;
    }
 
    public bool OnJavaScriptPrompt(IWebBrowser browserControl, IBrowser browser, IFrame frame, string message, string defaultValue, out string result)
    {
        // 处理prompt对话框
        System.Windows.Forms.Form promptForm = new System.Windows.Forms.Form() { Width = 500, Height = 150, StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen };
        System.Windows.Forms.TextBox textBox = new System.Windows.Forms.TextBox() { Size = new System.Drawing.Size(470, 20), Location = new System.Drawing.Point(10, 50), Text = defaultValue };
        System.Windows.Forms.Button okButton = new System.Windows.Forms.Button() { Size = new System.Drawing.Size(75, 23), Location = new System.Drawing.Point(315, 75), Text = "OK", DialogResult = System.Windows.Forms.DialogResult.OK };
        System.Windows.Forms.Button cancelButton = new System.Windows.Forms.Button() { Size = new System.Drawing.Size(75, 23), Location = new System.Drawing.Point(400, 75), Text = "Cancel", DialogResult = System.Windows.Forms.DialogResult.Cancel };
        promptForm.Controls.Add(textBox);
        promptForm.Controls.Add(okButton);
        promptForm.Controls.Add(cancelButton);
        promptForm.AcceptButton = okButton;
        promptForm.CancelButton = cancelButton;
 
        if (promptForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            result = textBox.Text;
            return true; // 返回true表示处理了prompt
        }
        else
        {
            result = defaultValue;
            return true; // 返回true表示处理了prompt
        }
    }
}

在上述代码中,我们创建了一个MyDDisplayHandler类,它实现了IDDisplayHandler接口。我们重写了OnJavaScriptAlert、OnJavaScriptConfirm和OnJavaScriptPrompt方法来分别处理JavaScript的alert、confirm和prompt对话框。对于prompt对话框,我们使用了Windows窗体来创建一个简单的输入界面。

要在CefSharp的Browser对象中使用这个处理器,你需要在创建Browser对象时将其设置为Browser对象的DDisplayHandler:

var browser = new ChromiumWebBrowser("http://example.com");
browser.DDisplayHandler = new MyDDisplayHandler();

这样,当网页中的JavaScript代码调用alert、confirm或prompt函数时,就会使用MyDDisplayHandler中定义的逻辑来显示对话框。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容