如何从控制台应用程序截取 WebView2 的屏幕截图

Mik*_*ike 6 wpf webview2

我正在尝试从控制台应用程序获取 WebView2 输出的屏幕截图。该应用程序是从非交互式 Windows 服务调用的。控制台应用程序的目的是从 WPF 控件生成图形文件。我目前可以对绘制图表等图形的用户控件执行此操作。我的控制台应用程序是一个没有用户界面的 WPF 应用程序。我正在尝试对 WebView 执行相同的操作,但是当隐藏控件时,对 EnsureCoreWebView2Async 的调用会挂起。看来控件必须是可见的。那么一切都很好。有没有办法在没有实际显示控件的情况下让它工作?

XAML

<Window x:Class="WebView2WPFHidden.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
    xmlns:local="clr-namespace:WebView2WPFHidden"        
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800"
    Visibility="Hidden">
<Grid>
    <wv2:WebView2 Name="webView"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)

代码隐藏

    public MainWindow()
    {
        InitializeComponent();

        _ = InitializeAsync();
    }

    private async Task InitializeAsync()
    {
        await webView.EnsureCoreWebView2Async(null);
        webView.NavigationCompleted += WebView_NavigationCompleted;
        webView.Source = new Uri("https://www.microsoft.com");
    }

    private void WebView_NavigationCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e)
    {
        try
        {
            _ = SaveScreenshot((int)Width, (int)Height);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    private async Task SaveScreenshot(int width, int height)
    {
        try
        {
            dynamic clip = new JObject();
            clip.x = 0;
            clip.y = 0;
            clip.width = width;
            clip.height = height;
            clip.scale = 1;

            dynamic settings = new JObject();
            settings.format = "png";
            settings.clip = clip;
            settings.fromSurface = true;
            settings.captureBeyondViewport = true;

            var p = settings.ToString(Newtonsoft.Json.Formatting.None);

            var devData = await webView.CoreWebView2.CallDevToolsProtocolMethodAsync("Page.captureScreenshot", p);

            var imgData = (string)((dynamic)JObject.Parse(devData)).data;
            var ms = new MemoryStream(Convert.FromBase64String(imgData));
            var bitmap = (Bitmap)Image.FromStream(ms);
            bitmap.Save("c:\\temp\\screenshot.png");
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 1

WebView2 无法在屏幕外渲染。所以这是不可能的。