获取Web浏览器控件的屏幕截图?

问题描述 投票:5回答:2

有很多与此相关的主题,但是没有一个主题很明确,我尝试过的任何一个主题实际上都无法正常工作。

获取整个Web浏览器控件(甚至是不在屏幕上的控件)内容的代码是什么?

看起来好像确实有:

webBrowser1.DrawToBitmap(); // but its unsupported and doesnt work
  1. 3rd party api - not wasting my time
  2. .DrawToBitmap and nonanswer-links
  3. 100 wrong answers
  4. just takes a screenshot
c# webbrowser-control screenshot
2个回答
3
投票

我上周在我的项目中从事类似功能的研究,请阅读有关该主题的几篇文章,包括您的链接。我想分享我的经验:

此功能的关键部分是System.Windows.Forms.WebBrowser.DrawToBitmap方法。

但是它不受支持并且不起作用

它受支持且确实有效,但并非总是能正常工作。在某些情况下,您将获得空白图像屏幕截图(以我的经验,它加载的html越复杂,失败的可能性就越大。在我的项目中,只有非常简单且格式正确的html会被加载到WebBrowser控件中,所以我从没得到过空白图片)。

无论如何,我也没有100%完美的解决方案。这是我的核心代码的一部分,希望对您有所帮助(它可以在ASP.NET MVC 3上运行)。

using (var browser = new System.Windows.Forms.WebBrowser())
{
     browser.DocumentCompleted += delegate
     {
         using (var pic = new Bitmap(browser.Width, browser.Height))
         {
             browser.DrawToBitmap(pic, new Rectangle(0, 0, pic.Width, pic.Height));
             pic.Save(imagePath);
         }
     };

     browser.Navigate(Server.MapPath("~") + htmlPath); //a file or a url
     browser.ScrollBarsEnabled = false;

     while (browser.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
     {
         System.Windows.Forms.Application.DoEvents();
     }
}

6
投票

尝试确保您正在DocumentCompleted事件中调用该方法。

webBrowser1.Width = wb.Document.Body.ScrollRectangle.Width;
webBrowser1.Height = wb.Document.Body.ScrollRectangle.Height;

Bitmap bitmap = new Bitmap(webBrowser1.Width, webBrowser1.Height);
webBrowser1.DrawToBitmap(bitmap, new Rectangle(0, 0, webBrowser1.Width, webBrowser1.Height));
© www.soinside.com 2019 - 2024. All rights reserved.