Скриншоты сайтов на .Net

Как оказалось делать скриншоты сайтов не такая уж и простая задача. Но выход из нее можно найти создавая отдельным потоком скрытую форму с объектом WebBrowser и используя некоторые компоненты MS IE7+.
Ниже идет малокомментированный код, который подскажет Вам, как это правильнее всего сделать. Если есть вопросы, то гуглите и разбирайтесь в документации:
Copy Source | Copy HTML
  1. #region private event handlers
  2.  
  3.  
  4.     /// <summary>
  5.     /// События результата открытия страницы в браузере _webBrowser.Navigate(url.OriginalString);
  6.     /// </summary>
  7.     private unsafe void OnDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
  8.     {
  9.         WebBrowser browser = (sender as WebBrowser);
  10.         if (browser != null)
  11.         {
  12.             if(!browser.DocumentText.Contains("<!--Error Body-->"))//если открылось
  13.             {
  14.                 int width = browser.Document.Body.ScrollRectangle.Size.Width;
  15.                 int height = browser.Document.Body.ScrollRectangle.Size.Height;
  16.                 this.Size = browser.Document.Body.ScrollRectangle.Size;
  17.                 this.ClientSize = browser.Document.Body.ScrollRectangle.Size;
  18.  
  19.                 this.Height = 10;
  20.                 this.Width = 20;
  21.                 browser.Width = width;
  22.                 this.Top = -200;
  23.                 browser.Top = -100;
  24.                 browser.Height = 5000;//height;
  25.                 panel.AutoScrollPosition = new Point(300, 300);
  26.                 this.Refresh();
  27.                 //повторный рендеринг страницы тут нужен
  28.                 back.RunWorkerAsync();
  29.             }
  30.         }
  31.     }
  32.  
  33.     void back_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  34.     {
  35.         WebBrowser browser = this._webBrowser;
  36.         if (browser != null)
  37.         {
  38.             if (!browser.DocumentText.Contains("<!--Error Body-->"))
  39.             {
  40.                 int width = browser.Document.Body.ScrollRectangle.Size.Width;
  41.                 int height = browser.Document.Body.ScrollRectangle.Size.Height;
  42.                 //объект из IE7+
  43.                 mshtml.IHTMLDocument2 document = (browser.Document.DomDocument as mshtml.IHTMLDocument2);
  44.  
  45.                 if (document != null)
  46.                 {
  47.                     mshtml.IHTMLElement element = (document.body as mshtml.IHTMLElement);
  48.                     if (element != null)
  49.                     {
  50.                         IHTMLElementRender render = (element as IHTMLElementRender);
  51.                         if (render != null)
  52.                         {
  53.                             Image img = new Bitmap(width, height);
  54.                             using (Graphics graphics = Graphics.FromImage(img))
  55.                             {
  56.                                 IntPtr hdcDestination = graphics.GetHdc();
  57.                                 render.DrawToDC(hdcDestination);
  58.                                 graphics.ReleaseHdc(hdcDestination);
  59.                               //  browser.DrawToBitmap((Bitmap)img, new Rectangle(0, 0, width, height));
  60.                                 string FileName = wheretosave;
  61.                                 _webBrowser.DrawToBitmap((Bitmap)img, new Rectangle(0, 0, width, height));
  62.                                 img.Save(FileName);
  63.                             }
  64.                         }
  65.                     }
  66.                 }
  67.             }
  68.         }
  69.         this.Close();
  70.     }
  71.  
  72.     void back_DoWork(object sender, DoWorkEventArgs e)
  73.     {
  74.         Thread.Sleep(5000);
  75.     }
  76.  
  77.     #endregion

Метки:   Категории:Csharp | Code


blog comments powered by Disqus

Добавить комментарий

Кто я?

Программист. Я слежу за блогосферой и знаю, как будет развиваться интернет. Когда у меня есть время я даже прилагаю для этого усилия. Подробнее

Последние комментарии

Не отображать

Topbot at FeedsBurner

Мои Твиты

Twitter июля 21, 06:27
Украина готовит на Евровидение песню с быками http://dlvr.it/QcGlCH

Twitter июля 21, 06:27
Суммарная капитализация криптовалют http://dlvr.it/QcGl8J

Twitter июля 21, 06:27
В Твиттере начался обвал фолловеров http://dlvr.it/QcGl9p

Twitter июля 20, 13:36
Разбор трилогии Матрицы (The Matrix Trilogy) http://dlvr.it/QcBwFH https://twitter.com/f1ashr/status/1020301316550086656/photo/1

Twitter июля 20, 01:04
Чем белые отличаются от черных? http://dlvr.it/Qc7sJx https://twitter.com/f1ashr/status/1020112062507233281/photo/1

Twitter июля 19, 23:57
Победа свободы над здравым смыслом http://dlvr.it/Qc7fVm https://twitter.com/f1ashr/status/1020095354983731201/photo/1

Twitter июля 19, 22:17
Роскомнадзор планирует заблокировать IP сайта t30p http://dlvr.it/Qc7JG9

Twitter июля 19, 20:39
коломенский кремль: альтернативная история 2 http://dlvr.it/Qc6v6H https://twitter.com/f1ashr/status/1020045378324914176/photo/1

Twitter июля 18, 22:44
Трансляции Одноклассников (http://Ok.ru/live) добавлены в t30p http://dlvr.it/Qc18JK https://twitter.com/f1ashr/status/1019714458350891009/photo/1

Twitter июля 18, 22:44
Теневой бизнес ГИБДД http://dlvr.it/Qc18HP https://twitter.com/f1ashr/status/1019714453678436352/photo/1

Twitter июля 18, 22:44
Непонятные конкурсы в Твиттере http://dlvr.it/Qc188b https://twitter.com/f1ashr/status/1019714448993337344/photo/1

Twitter июля 18, 22:44
Текущая ситуация с инстаграммом http://dlvr.it/Qc186r

Twitter июля 18, 22:12
Пользователи умудрились поломать гео-локацию в Инстаграм http://dlvr.it/Qc12Fq

Twitter июля 18, 22:12
Разбор сериала Рассказ служанки http://dlvr.it/Qc1228 https://twitter.com/f1ashr/status/1019706394503667714/photo/1

Twitter июля 18, 22:12
Разбор сериала "Мир Дикого Запада" http://dlvr.it/Qc120F

Twitter июля 18, 21:08
Google Lunar X Prize - за 10 лет никто не смог запуститься на Луну http://dlvr.it/Qc0myX https://twitter.com/f1ashr/status/1019690286862102528/photo/1

Twitter июля 18, 21:08
Китайский интернет http://dlvr.it/Qc0mtX https://twitter.com/f1ashr/status/1019690280860053504/photo/1

Twitter июля 18, 20:34
Левитирующие объекты в Японии http://dlvr.it/Qc0dvs

Twitter июля 14, 22:59
Диджеи будущего http://dlvr.it/QbZSKL

Twitter июля 14, 20:46
Китай: скрытая угроза http://dlvr.it/QbZ5XZ

Мой твиттер

Копирайт

Все мысли, высказанные в блоге, являются моим мнением и за это мнение меня никто не забанит! Кроме того, никто не имеет право копировать материалы блога без использования ctrl+C/V!

© Copyright 2008