【转载】WebView2的 疑难 之浏览器总是在最上面(也就是空域问题)
问题由来:在做wpf开发的时,我将WebView2用一个滚动包起来,结果浏览器总是在最上面,完全突破了滚动条的区块限制。

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

浙公网安备 33010602011771号