2013-01-05 10 views
5

Jest wiele tematów na ten temat, ale żaden z nich nie był jasny i żaden z nich nawet nie działał prawidłowo.Uzyskaj zrzut ekranu kontrolki przeglądarki?

Jaki jest kod, aby uzyskać zawartość całego elementu sterującego przeglądarki (nawet tego, który jest poza ekranem)?

Wygląda jak oni mają:

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
+3

Jeśli masz na myśli wątki SO, to co z linkami do nich i wyjaśnienie, dlaczego każdy z nich nie zadziałał –

+0

tam jesteś Matt. btw czy znasz odpowiedź? – user1873073

+0

@ user1873073 proszę opublikuj część swojego kodu. szczególnie w przypadku ładowania dokumentu i zdarzenia ukończonego dokumentu. – scartag

Odpowiedz

3

W zeszłym tygodniu pracowałem nad podobną funkcją w moim projekcie, przeczytałem kilka postów na ten temat, w tym również linki. Chciałbym podzielić się swoim doświadczeniem:

Kluczową częścią tej funkcji jest metoda System.Windows.Forms.WebBrowser.DrawToBitmap.

ale jego obsługiwane i nie robi praca

jest obsługiwane i działa, ale nie zawsze działa poprawnie. W niektórych okolicznościach dostaniesz zrzut ekranu z pustym obrazem (z mojego doświadczenia wynika, że ​​bardziej złożony HTML ładuje się, tym bardziej możliwe, że się nie uda W moim projekcie tylko bardzo proste i dobrze sformatowane htmle zostaną załadowane do formantu WebBrowser, więc nigdy nie dostanę puste obrazy).

W każdym razie nie mam również w 100% idealnego rozwiązania. Oto część mojego podstawowego kodu i mam nadzieję, że to pomaga (działa na 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(); 
    } 
} 
+2

Czy masz jakieś obejść problem, który napotkał "problem pustego obrazu". Ponieważ właśnie się z tym zmierzyłem. Dzięki – Vivekh

+0

Mam obraz svg jako tło i html na nim, a dane z json są mapowane na dom wewnątrz kontroli webbrowser.Otrzymuję również pusty obraz – Sandeep

+0

@Sandeep Jak już powiedziałem w odpowiedzi, nie wiem, jak rozwiązać problem z pustą stroną, jeśli strona HTML jest dość złożona. –

6

Spróbuj upewnić się, że nazywając metoda w zdarzeniu 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)); 
+0

to może być to, ale moim celem jest móc zrobić wyszukiwanie w wyszukiwarce Google i kliknąć pokaż więcej, aż dojdzie do dna, a następnie kliknij przycisk, aby dokument zakończony nie działa. – user1873073

+0

@ user1873073 nie wiesz, dlaczego uważasz, że nie będzie działać. dokument zakończony zostanie wywołany wiele razy (po jednym dla każdego nowego wniosku), ważne jest to, co robi podczas ostatniego połączenia. – scartag

+0

Ya wiem, ja pierwotnie napisałem tę wielką implementację, która zrobiła zdjęcie bezpośrednio z okien otwartej kontroli, następnie przewinąłem kontrolkę i zszyłem razem obrazy. Potem naprawiłem jak najwięcej problemów związanych z przewijaniem ... Ale właśnie teraz przypadkowo znalazłem twój wpis i zrobiłem szeroko otwarte oczy: możesz po prostu ustawić szerokość na znacznie większą niż to, co można wyświetlić na ekranie, a tam jest żaden problem?! Twoje dwa małe wiersze zastąpiły w moim programie jakieś 200-300. Jedyną różnicą jest to, że teraz używam ActiveX Captor, ponieważ DrawToBitmap jest niewiarygodny. W każdym razie, dziękuję za uproszczenie mojego kodu. –