I use the method shown in
WebBrowser control in a new stream
Trying to get a screenshot of a webpage, I managed to get the following code to work successfully when the WebBrowser hosted on WinForm . However, it fails by providing an arbitrary desktop image when launched inside the stream.
Thread browserThread = new Thread(() => { WebBrowser br = new WebBrowser(); br.DocumentCompleted += webBrowser1_DocumentCompleted; br.ProgressChanged += webBrowser1_ProgressChanged; br.ScriptErrorsSuppressed = true; br.Navigate(url); Application.Run(); }); browserThread.SetApartmentState(ApartmentState.STA); browserThread.Start(); private Image TakeSnapShot(WebBrowser browser) { int width; int height; width = browser.ClientRectangle.Width; height = browser.ClientRectangle.Height; Bitmap image = new Bitmap(width, height); using (Graphics graphics = Graphics.FromImage(image)) { Point p = new Point(0, 0); Point upperLeftSource = browser.PointToScreen(p); Point upperLeftDestination = new Point(0, 0); Size blockRegionSize = browser.ClientRectangle.Size; blockRegionSize.Width = blockRegionSize.Width - 15; blockRegionSize.Height = blockRegionSize.Height - 15; graphics.CopyFromScreen(upperLeftSource, upperLeftDestination, blockRegionSize); } return image; }
This, obviously, is due to the Graphics.CopyFromScreen() method, but I don't know a different approach. Is there a way to solve this problem that anyone can offer? or is my only option to create a form, add a control, make it visible, and then script? For obvious reasons, I hope to avoid this approach.
multithreading c # screen-scraping webbrowser-control apartments
Maxim Gershkovich Sep 07 '13 at 16:45 2013-09-07 16:45
source share