Microsoft Edge WebView2 截图

使用工具可以保存可见区域

CallDevToolsProtocolMethodAsync("Page.captureScreenshot", Params) always returns only visible part of html page including scrollbars. I tried all possible combinations of "fromSurface" and "captureBeyondViewport" values, no difference. I'm using 1.0.705.50 WinForms.

使用下面方法最终解决

        public async Task<Image> TakeWebScreenshot(bool currentControlClipOnly = false)
        {
            dynamic scl = null;
            Size    siz;

            if (!currentControlClipOnly)
            {
                var  res = await wv2.CoreWebView2.ExecuteScriptAsync(@"var v = {""w"":document.body.scrollWidth, ""h"":document.body.scrollHeight}; v;");
                try{ scl = JObject.Parse(res); }catch{}
            }
            siz = scl != null ? 
                        new Size(   (int)scl.w > wv2.Width ? (int)scl.w : wv2.Width,
                                    (int)scl.h > wv2.Height ? (int)scl.h : wv2.Height )
                        :
                        wv2.Size;

            var img = await GetWebBrowserBitmap(siz);
            return img;
        }

        private async Task<Bitmap> GetWebBrowserBitmap(Size clipSize)
        {
            dynamic clip        = new JObject();
            clip.x              = 0;
            clip.y              = 0;
            clip.width          = clipSize.Width;
            clip.height         = clipSize.Height;
            clip.scale          = 1;

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

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

            var devData = await wv2.CoreWebView2.CallDevToolsProtocolMethodAsync("Page.captureScreenshot", p);
            var imgData = (string)((dynamic)JObject.Parse(devData)).data;
            var ms      = new MemoryStream(Convert.FromBase64String(imgData));
            return (Bitmap)Image.FromStream(ms);
        }
### Microsoft Edge WebView2 使用指南 #### 安装与配置 WebView2 是由微软提供的一个控件,旨在帮助开发者在其桌面应用程序中嵌入 Web 内容。此控件基于 Chromium 引擎构建,并提供了对最新网络标准的支持以及增强的安全功能[^1]。 对于希望利用 WebView2 功能的应用程序来说,安装 WebView2 Runtime 是必不可少的第一步。用户可以从官方渠道获取该运行时环境: - **独立的 WebView2 Runtime**: 可通过 [Microsoft Developer](https://developer.microsoft.com/zh-cn/microsoft-edge/webview2/) 页面下载并单独安装。 - **随附于新版 Edge 浏览器**: 如果目标机器上已安装有较新的 Microsoft Edge (Chromium 版),则通常无需额外操作即可满足 WebView2 运行所需条件[^5]。 一旦完成上述任一方式中的安装过程之后,在开发环境中集成 WebView2 就变得相对简单了。例如,在 Delphi 中实现这一目的的具体做法如下所示[^3]: ```delphi uses Vcl.WebBrowser, Winapi.WebView2; procedure TForm1.FormCreate(Sender: TObject); var webView: TEdgeWebView; begin webView := TEdgeWebView.Create(Self); try webView.Parent := Self; webView.Align := alClient; // 初始化 WebView 控件 webView.DefaultURL := 'http://example.com'; webView.Initialize; except on E: Exception do ShowMessage('Failed to initialize WebView2 control.'); end; end; ``` 这段代码展示了如何创建一个新的 `TEdgeWebView` 实例并将之添加到窗体当中;同时指定了默认加载页面 URL 并调用了初始化方法来启动渲染进程。 #### 常见问题解决方案 当遇到无法正常显示网页或其他异常情况时,可以尝试以下几个建议来进行排查和修复: - 确认已经成功安装了 WebView2 Runtime 或者对应的 Microsoft Edge 浏览器版本; - 检查应用程序是否具有足够的权限访问互联网资源或读取本地文件系统路径; - 更新至最新发布的 WebView2 SDK 和相关依赖库以获得更好的性能表现及稳定性改进; - 查看控制台日志输出寻找可能存在的错误提示信息作为进一步诊断依据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值