You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET中如何为CefSharp浏览器启用深色模式?

解决方案:CefSharp 启用深色模式的兼容方案

一、正确配置强制深色渲染的命令行参数

你之前添加--enable-features=WebContentsForceDark无效,核心原因是参数添加方式错误。需在CefSettings中开启命令行参数自定义权限后,通过CefCommandLineArgs属性添加参数,而非直接修改系统命令行。

C# 初始化代码示例:

public bool InitializeCefSharp()
{
    if (Cef.IsInitialized)
    {
        throw new InvalidOperationException("CefSharp is already initialized.");
    }

    string cachePath = $"{System.Windows.Forms.Application.StartupPath}\\cache\\CefSharp";

    var settings = new CefSettings
    {
        CachePath = cachePath,
        RootCachePath = cachePath,
        CommandLineArgsDisabled = false, // 必须设为false才能自定义命令行参数
        IgnoreCertificateErrors = true,
        Locale = "en-US",
        PersistSessionCookies = true,
        PersistUserPreferences = false,
        WindowlessRenderingEnabled = false
    };

    // 添加深色模式相关命令行参数
    // 方案1:跟随系统深色模式,适配prefers-color-scheme的网站自动切换
    settings.CefCommandLineArgs.Add("force-dark-mode", "true");
    // 方案2:强制所有网站深色渲染(基于HSL颜色反转,兼容未适配的网站)
    settings.CefCommandLineArgs.Add("enable-features", "WebContentsForceDark:darkness_amount=0.8,hsl_shift=0");
    // 可选:禁用浅色模式强制覆盖,避免冲突
    settings.CefCommandLineArgs.Add("disable-features", "WebContentsForceLight");

    bool success = Cef.Initialize(settings, performDependencyCheck: true);
    return success;
}

VB.NET 初始化代码示例:

Public Function InitializeCefSharp() As Boolean
    If Cef.IsInitialized Then
        Throw New InvalidOperationException("CefSharp is already initialized.")
    End If

    Dim cachePath As String = $"{System.Windows.Forms.Application.StartupPath}\cache\CefSharp"

    Dim settings As New CefSettings With {
        .CachePath = cachePath,
        .RootCachePath = cachePath,
        .CommandLineArgsDisabled = False,
        .IgnoreCertificateErrors = True,
        .Locale = "en-US",
        .PersistSessionCookies = True,
        .PersistUserPreferences = False,
        .WindowlessRenderingEnabled = False
    }

    ' 添加深色模式相关命令行参数
    settings.CefCommandLineArgs.Add("force-dark-mode", "true")
    settings.CefCommandLineArgs.Add("enable-features", "WebContentsForceDark:darkness_amount=0.8,hsl_shift=0")
    settings.CefCommandLineArgs.Add("disable-features", "WebContentsForceLight")

    Dim success As Boolean = Cef.Initialize(settings, performDependencyCheck:=True)
    Return success
End Function

参数说明:

  • force-dark-mode=true:让Chromium识别系统深色模式,适配prefers-color-scheme: dark的网站会自动切换为深色主题。
  • WebContentsForceDark:darkness_amount=0.8,hsl_shift=0:强制对所有网站进行深色渲染,其中:
    • darkness_amount:控制暗度,取值范围0-1,值越大页面越暗
    • hsl_shift=0:保持原始色相不变,仅调整亮度和饱和度,避免颜色失真

二、使用SetAutoDarkModeOverrideAsync强制深色渲染

该方法是ChromiumWebBrowser的实例方法,可手动覆盖自动深色模式设置,无需依赖系统主题。

VB.NET 调用示例:

' 在ChromiumWebBrowser实例创建完成后调用
Await chromiumWebBrowser1.SetAutoDarkModeOverrideAsync(True, CefAutoDarkModeState.ForceDark)

此方法会强制浏览器以深色模式渲染所有内容,包括未适配深色主题的网站。

三、修正prefers-color-scheme注入方案

若需让网站主动识别深色模式,可通过自定义RequestHandler实现两种效果:一是向网站发送深色偏好Header,二是对未适配网站注入CSS反转颜色。

VB.NET 自定义RequestHandler示例:

Public Class CustomRequestHandler
    Inherits DefaultRequestHandler

    Protected Overrides Function GetResourceRequestHandler(chromiumWebBrowser As IWebBrowser, browser As IBrowser, frame As IFrame, request As IRequest, isNavigation As Boolean, isDownload As Boolean, requestInitiator As String, ByRef disableDefaultHandling As Boolean) As IResourceRequestHandler
        Return New CustomResourceRequestHandler()
    End Function
End Class

Public Class CustomResourceRequestHandler
    Inherits DefaultResourceRequestHandler

    Protected Overrides Function OnBeforeResourceLoad(chromiumWebBrowser As IWebBrowser, browser As IBrowser, frame As IFrame, request As IRequest, callback As IRequestCallback) As CefReturnValue
        ' 注入Header告知网站当前为深色模式
        request.SetHeaderByName("Sec-CH-Prefers-Color-Scheme", "dark", True)
        Return MyBase.OnBeforeResourceLoad(chromiumWebBrowser, browser, frame, request, callback)
    End Function

    Protected Overrides Sub OnResourceResponse(chromiumWebBrowser As IWebBrowser, browser As IBrowser, frame As IFrame, request As IRequest, response As IResponse)
        ' 对未适配的HTML页面注入深色反转CSS
        If response.MimeType = "text/html" Then
            Dim darkCss As String = "<style>html { filter: invert(90%) hue-rotate(180deg); background: #1a1a1a; } img, video, iframe { filter: invert(90%) hue-rotate(180deg); }</style>"
            frame.ExecuteJavaScriptAsync(darkCss)
        End If
        MyBase.OnResourceResponse(chromiumWebBrowser, browser, frame, request, response)
    End Sub
End Class

绑定RequestHandler到浏览器:

chromiumWebBrowser1.RequestHandler = New CustomRequestHandler()

四、注意事项

  1. 确保使用CefSharp 90及以上版本,早期版本对深色模式支持不完善。
  2. 命令行参数必须在Cef.Initialize之前添加,否则不生效。
  3. 避免同时启用多种深色模式方案(如命令行参数+CSS注入),可能导致渲染冲突。

内容的提问来源于stack exchange,提问作者ElektroStudios

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:43:08