Voilà mon code qui doit effectuer une capture d'une page web :

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(); 
} 
}
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 ?