【转载】WebView2的 疑难 之浏览器总是在最上面(也就是空域问题)

问题由来:在做wpf开发的时,我将WebView2用一个滚动包起来,结果浏览器总是在最上面,完全突破了滚动条的区块限制。

QQ截图20260813195310

 

WebView2 仅支持窗口渲染。这种模式有两个显著缺点:需要窗口才能运行,且浏览器总是在最上面(也就是空域问题)。

WebView2 Github 上的这个问题部分回答了你的问题。我想补充一下我的看法。

总结:

  • WebView2没有模拟用户输入的API,也不适合自动化。
  • WebView2无法在屏幕外渲染。不能在控制台、服务或服务器上运行。
  • WebView2 运行在一个独立进程中;CefSharp 运行在应用流程中。
  • WebView2 有一个沙盒;CefSharp 没有。

这个回答基于我个人的经验,并不是详尽的比较。

原文

chromium embedded - CefSharp vs WebView2 - Stack Overflow

流程模型

铬工艺模型包含工艺和许多辅助工艺。当然,这只是一个直接的简化,但也足够了。

CefSharp和WebView2都遵循这一过程模型,但有一个非常重要的区别。CefSharp 在应用程序进程中启动 Chromium,而 WebView2 则作为独立进程启动。

进程中模型是所有基于CEF的浏览器的共同特征。优点:浏览器启动更快。缺点:

  • 如果CEF崩溃,应用也会随之崩溃。
  • 如果CEF或Chromium存在漏洞,也可能暴露应用程序的内存。

程序外模型在专有浏览器中很受欢迎。不仅WebView2是这样工作的,DotNetBrowser和EO也是如此。网页浏览器。优点:

  • 这样更安全。
  • 它不会咬掉应用程序的内存。 缺点:
  • 它开始得更长。
  • 由于进程间通信,速度可能变慢。
  • 偶尔,焦点和拖拽功能会出现问题,因为浏览器窗口属于另一个进程。不过这不适用于幕外渲染。

CefSharp工艺模型。WebView2 流程模型。

为WebView2制作的配乐。

幕外渲染

嵌入网页内容的渲染有两种方法。一种是把真正的铬窗里的花哨和花哨功能甩掉,嵌入到应用程序中。我们称之为“窗口模式”或“重量级”模式。另一种方法是在内存中渲染网页内容,并在任意表面上绘制。这叫做“屏幕外渲染”。

WebView2 仅支持窗口渲染。这种模式有两个显著缺点:需要窗口才能运行,且浏览器总是在最上面(也就是空域问题)。

CefSharp 也支持屏幕外渲染。它允许应用程序在控制台中运行,通过其他控件叠加网页内容,在Unity3D中渲染网页内容等。

2025年更新:WebView2现在已通过 https://learn.microsoft.com/en-us/microsoft-edge/webview2/platforms/wpf?tabs=dotnetcsharp 解决了这个问题。

CefSharp 的一分。

自动化

自动化的核心是模拟用户输入。CefSharp 有一个 API 可以将“真实”的鼠标和键盘事件分发到浏览器。浏览器将这些事件作为用户手势处理,JavaScript无法区分它们与真实人类输入。看看IBrowserHost里的和方法。SendMouse*SendKey*

WebView2 没有这样的 API,只有基于 Win API 的变通方法。

CefSharp 的一分。

沙盒

默认情况下,所有铬工艺都是沙箱式的。这让他们更安全。Chromium团队在这里详细解释了沙盒。

WebView2 和其他未完成进程的库也被沙箱化。

CefSharp不支持沙盒,而且看起来永远不会支持(#697)。

为WebView2制作的配乐。

 

 

我个人测试有效解决方法:https://www.cnblogs.com/cdaniu/p/22472357

posted @ 2026-08-13 19:56  小林野夫  阅读(6)  评论(0)    收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/