我正在尝试从控制台应用程序获取 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)