0

I used the seemingly ridiculously easy code found here

protected void Capture(object sender, EventArgs e)

{

string url = txtUrl.Text.Trim();

Thread thread = new Thread(delegate()

{

    using (WebBrowser browser = new WebBrowser())

    {

        browser.ScrollBarsEnabled = false;

        browser.AllowNavigation = true;

        browser.Navigate(url);

        browser.Width = 1024;

        browser.Height = 768;

        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 Rectangle(0, 0, browser.Width, browser.Height));

    using (MemoryStream stream = new MemoryStream())

    {

        bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);

        byte[] bytes = stream.ToArray();

        imgScreenShot.Visible = true;

        imgScreenShot.ImageUrl = "data:image/png;base64," + Convert.ToBase64String(bytes);

    }

}

}

However, when I run it against a facebook url, or certain other sites, I get an all white result image. Sometimes I get some of the initial page, so it seems like a matter of timing what with all the new web technologies.

WebBrowser may be indicating a ReadyState of Complete, even though elements on the page are continuing to load.

If I add some Thread.Sleeps, it doesn't appear to help.

Novox
  • 774
  • 2
  • 7
  • 24

1 Answers1

0

It is because DocumentCompleteddoesn't only fire once, which in your case is too early. Have a look at this: Why is WebBrowser_DocumentCompleted() firing twice?

Community
  • 1
  • 1
Lesic
  • 136
  • 12