Voilà mon code qui doit effectuer une capture d'une page web :
Ca fait son job, mais en bloquant le reste de l'application. Quelqu'un pourrait m'expliquer pourquoi, puis comment modifier ce code pour qu'il ne bloque plus l'appli quand je l'appelle ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 public class WebScreenShooter { //adresse web de la page à prendre en photo private string url = null; //taille de l'image private Size bmpSize; //image contenant la page web private Bitmap bmp = null; public Bitmap Image { get { return bmp; } } //objet pour la synchronisation des threads private ManualResetEvent mre = new ManualResetEvent(false); //timeout en secondes private int timeout = 5; #region Constructeur public WebScreenShooter(string url, Size bmpSize) { this.url = url; this.bmpSize = bmpSize; } #endregion #region TakeScreenShot public Bitmap TakeScreenShot() { //on crée notre thread qui va s'occuper de la capture d'image Thread t = new Thread(new ThreadStart(_TakeScreenShot)); //il est important de spéicifer que c'est un Single Thread Apartement //afin de pouvoir instancier l'objet WebBrowser t.SetApartmentState(ApartmentState.STA); //on démarre notre thread t.Start(); //on attent qu'il aille terminer mre.WaitOne(); //on termine le thread qui a capturer l'image t.Abort(); //on retourne l'image de la page web return bmp; } #endregion private void _TakeScreenShot() { //on instancie un objet webBrowser WebBrowser webBrowser = new WebBrowser(); //on prend le temps pour pouvoir gérer le timeout DateTime time = DateTime.Now; webBrowser.ScriptErrorsSuppressed = true; webBrowser.ScrollBarsEnabled = false; //on navigue à l'url spécifiée par l'utilisateur webBrowser.Navigate(url); //on attend que la page aille finit de se charger //avant de capturer son image webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted); //une petite boucle pour que le thread ne se termine pas tout de suite //on s'assure qu'on a pas dépassé le timeout while (true) { Thread.Sleep(100); TimeSpan deltaTime = DateTime.Now - time; if (deltaTime.Seconds >= timeout) mre.Set(); Application.DoEvents(); } } private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { WebBrowser webBrowser = (WebBrowser)sender; webBrowser.ClientSize = bmpSize; webBrowser.ScrollBarsEnabled = false; bmp = new Bitmap(webBrowser.Bounds.Width, webBrowser.Bounds.Height); webBrowser.BringToFront(); webBrowser.DrawToBitmap(bmp, webBrowser.Bounds); webBrowser.Dispose(); if (mre != null) mre.Set(); } public void Dispose() { if (bmp != null) this.bmp.Dispose(); //if (webBrowser != null) this.webBrowser.Dispose(); } }
Partager