2012-10-24 9 views
11

Używam WebKit.NET do integracji komponentu przeglądarki w mojej aplikacji C#. Problem polega na tym, że mogę uchwycić widoczną część w oknie przeglądarki za pomocą zrzutu ekranu. Czy istnieje sposób na przechwycenie zrzutu ekranu całej strony?Jak zrobić zrzut ekranu z pełną witryną za pomocą C# i WebKit.NET?

+0

można pisać kod? –

+1

@EmanueleGreco Nie, niestety nie, ale jutro przyjrzę się, jeśli uda mi się wydobyć jego minimalną wersję do celów demonstracyjnych. – topless

+0

Myślę, że pójdę z rozwiązaniem awesomium, ponieważ zapewnia warstwę pośrednią do wstrzykiwania kodu JavaScript również, co jest bardzo wygodne dla moich przyszłych planów. – topless

Odpowiedz

6

Używam zamiast tego WebBrowser; ScrollBarsEnabled = false pozwól mi przechwycić całą stronę.

Oto kod:

protected override void Render(HtmlTextWriter writer) 
{ 

     StringBuilder builder = new StringBuilder(); 
     HtmlTextWriter htw = new HtmlTextWriter(new StringWriter(builder)); 
     base.Render(htw); 
     string html = builder.ToString(); 

     _Generate(html); 
} 


private void _Generate(string html) 
{ 
    var browser = new WebBrowser { ScrollBarsEnabled = false }; 
    DisplayHtml(html, browser); 
    browser.DocumentCompleted += WebBrowser_DocumentCompleted; 
    while (browser.ReadyState != WebBrowserReadyState.Complete) 
     Application.DoEvents(); 
    browser.Dispose(); 
} 

private void DisplayHtml(string html, WebBrowser browser) 
{ 
    browser.Navigate("about:blank"); 
    if (browser.Document != null) 
    { 
     browser.Document.Write(string.Empty); 
    } 
    browser.DocumentText = html; 
} 
+0

Natknąłem się na kilka rozwiązań za pomocą składnika WebBrowser, ale jestem zainteresowany wykorzystaniem silnika WebKit do przechwytywania go. – topless

4

Spróbuj to:

using System.IO; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Threading; 
using System.Windows.Forms; 

    public byte[] picbytes; 

    private void capture_Click(object sender, EventArgs e) 
    { 

     makepicture(txtURL.Text.Trim()); 
     pictureBox1.Visible = true; 
     pictureBox1.Image = ByteToImage(picbytes); 
    } 

    private void makepicture(string url) 
    { 
     Thread thread = new Thread(delegate() 
     { 
      using (WebBrowser browser = new WebBrowser()) 
      { 
       browser.ScrollBarsEnabled = false; 
       browser.AllowNavigation = true; 
       browser.Navigate(url); 
       browser.Width = 1024; 
       browser.Height = 1575; 
       browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(DocumentCompleted); 
       while (browser.ReadyState != WebBrowserReadyState.Complete) 
       { 
        System.Windows.Forms.Application.DoEvents(); 
       } 

      } 
     }); 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start(); 
     thread.Join(); 
    } 

    private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     WebBrowser browser = sender as WebBrowser; 
     using (Bitmap bitmap = new Bitmap(browser.Width, browser.Height)) 
     { 
      browser.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, browser.Width, browser.Height)); 
      using (MemoryStream stream = new MemoryStream()) 
      { 
       bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png); 
       byte[] bytes = stream.ToArray(); 
       picbytes = bytes; 

      } 
     } 
    } 

    public static Bitmap ByteToImage(byte[] blob) 
    { 
     MemoryStream mStream = new MemoryStream(); 
     byte[] pData = blob; 
     mStream.Write(pData, 0, Convert.ToInt32(pData.Length)); 
     Bitmap bm = new Bitmap(mStream, false); 
     mStream.Dispose(); 
     return bm; 

    } 
+0

Czy możesz podać wcięcie swojego kodu? ("Edytuj", wybierz wszystko, Ctrl-k). Dzięki. – byako

+0

Działa to doskonale, z jedną skazą. Naprawdę potrzebujesz znać wymiary, aby ustawić kontrolę przeglądarki, ponieważ wydrukuje tylko to, co jest w środku. Domyślam się, że jest to teraz szukanie, jak określić szerokość i wysokość strony internetowej. – Switch

+0

w DocumentCompleted() dodaj następujące, zaraz po utworzeniu obiektu przeglądarki. int height = browser.Document.Body.ScrollRectangle.Height; int width = browser.Document.Body.ScrollRectangle.Width; browser.Height = height; browser.Width = width; – Switch

Powiązane problemy