CAPTURE D'ECRAN "EN .NET"

Dereckson Messages postés 3 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 8 octobre 2006 - 1 déc. 2003 à 15:36
ghik Messages postés 3 Date d'inscription jeudi 10 juillet 2008 Statut Membre Dernière intervention 10 juillet 2008 - 10 juil. 2008 à 14:32
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/18327-capture-d-ecran-en-net

ghik Messages postés 3 Date d'inscription jeudi 10 juillet 2008 Statut Membre Dernière intervention 10 juillet 2008
10 juil. 2008 à 14:32
ghik Messages postés 3 Date d'inscription jeudi 10 juillet 2008 Statut Membre Dernière intervention 10 juillet 2008
10 juil. 2008 à 13:45
Même chose en tout simple et complet :

"
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

namespace MaCapture
{
class Grab
{
public Bitmap CaptureScreen()
{
Bitmap b = new Bitmap(
SystemInformation.VirtualScreen.Width,
SystemInformation.VirtualScreen.Height);
Graphics g = Graphics.FromImage(b);
g.CopyFromScreen(0, 0, 0, 0, b.Size);
g.Dispose();
return b;
}
}
}

"
ghik Messages postés 3 Date d'inscription jeudi 10 juillet 2008 Statut Membre Dernière intervention 10 juillet 2008
10 juil. 2008 à 13:10
Hello,
Nickel comme code, je vais essayer ça de suite.
Merci
SharpCoder Messages postés 1 Date d'inscription vendredi 16 mai 2008 Statut Membre Dernière intervention 1 juillet 2008
1 juil. 2008 à 10:03
bonjour,
Comment faire pour ajouter ScreenLib comme référence à partir du fichier WindowsDesktops.cs ?
damned3 Messages postés 22 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 18 décembre 2007
27 juin 2007 à 01:38
J'ai cherché à faire la même chose que HAGEN dernièrement et je suis arrivé à ça
(ça marche très bien) :

screenBmp = new Bitmap(width, height); // largeur et hauteur du rectangle que tu veux.
bmpGraphics = Graphics.FromImage(screenBmp);
bmpGraphics.CopyFromScreen(new Point(x, y), new Point(0, 0), new Size(width, height));
// encore la même largeur et hauteur, x et y sont les coordonnées du coin du
// rectangle dans l'écran.

Quant à GG00xiv, tu présentes une nouvelle façon de faire une vieille chose, ça mérite un 7/10
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
7 juil. 2005 à 23:14
hagen132456 Messages postés 25 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 juillet 2005
6 juil. 2005 à 10:13
salut à tous.
moi aussi je suis dans la capture d'écran ;)

intéressant les remarques...
moi j'ai uen tute question:
GetDesktopWindow() c'est pas une méthode du framework???c vous qui la déclarer c tout car je la trouve pas ds msdn!

de plus moi j'ai un autre pblm:
la on récupère un screen complet!
moi je souhaiterais via deux point passé en paramètre de la méthode par example, tracé un rectangle qui délimiterai la zone de sscreen que ej souhaite récupérer.
en effet je dois récupérer un screen shot mais pas de l'écran complet, seulement une zone de l'écran et je n'y arrive pas!
kk1 à déjà réaliser cela ou pourrai me filer un ptit cou de pouce?
merci
bon courage
++
jf
LUDINSKI Messages postés 441 Date d'inscription mardi 2 décembre 2003 Statut Membre Dernière intervention 22 mai 2012 8
20 sept. 2004 à 17:08
Bravo, en tout cas !!
Il me fallait un moyen de capturer puis imprimer l'écran. Je pensais qu'une classe .Net existait, mais bon tampis !!

Bonne continuation !! 7/10
gg00xiv Messages postés 656 Date d'inscription mercredi 22 août 2001 Statut Membre Dernière intervention 11 mars 2005 13
14 mars 2004 à 12:43
Il est pas vide, il contient un fichier .cs, et ScreenLib est le nom du namespace contenant cette classe.
Utilisateur anonyme
8 mars 2004 à 23:36
C'est vria que ton zip est vide :S
bucherb Messages postés 412 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 13 août 2007
13 janv. 2004 à 11:47
Je trouve pas ta librairie... ScreenLib.. tu la sors d'où?
bucherb Messages postés 412 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 13 août 2007
13 janv. 2004 à 11:43
Si il est 50% plus lent c'est qu'il est plus rapide non? ;-)
gg00xiv Messages postés 656 Date d'inscription mercredi 22 août 2001 Statut Membre Dernière intervention 11 mars 2005 13
6 déc. 2003 à 12:32
Je viens de tester le code présenté deux post au dessus, il est 50% plus lent que l'exemple entièrement API Windows que j'ai posté. Maintenant à qui voudra jugé de la simplicité de lecture plutot qu'aux performances ...

Méthode de test :
private void button1_Click(object sender, System.EventArgs e)
{
DateTime tStart = DateTime.Now;
for (int i=0; i<100; i++)
{
Bitmap bmp = GetScreenBitmap();
bmp = null;
GC.Collect();
}
button1.Text = (DateTime.Now - tStart).TotalMilliseconds.ToString();
}

private void button2_Click(object sender, System.EventArgs e)
{
DateTime tStart = DateTime.Now;
for (int i=0; i<100; i++)
{
Image img = ScreenLib.WindowsDesktop.CaptureScreen();
img = null;
GC.Collect();
}
button2.Text = (DateTime.Now - tStart).TotalMilliseconds.ToString();
}
gg00xiv Messages postés 656 Date d'inscription mercredi 22 août 2001 Statut Membre Dernière intervention 11 mars 2005 13
4 déc. 2003 à 01:07
interessant cette technique, ca vaut le coup d'être noté
aogie Messages postés 108 Date d'inscription vendredi 11 juillet 2003 Statut Membre Dernière intervention 27 novembre 2007
3 déc. 2003 à 18:18
Plus simple :


[DllImport("user32.dll")]
private static extern IntPtr GetDesktopWindow();

[DllImport("gdi32.dll")]
private static extern bool BitBlt(
IntPtr hdcDest,
int nXDest,
int nYDest,
int nWidth,
int nHeight,
IntPtr hdcSrc,
int nXSrc,
int nYSrc,
int dwRop
);

private const int SRCCOPY = 0xCC0020;

public static Bitmap GetScreenBitmap()
{
Graphics gScreen = Graphics.FromHwnd(GetDesktopWindow());
Bitmap bmpScreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height);

Graphics gBmp = Graphics.FromImage(bmpScreen);

IntPtr hDCScreen = gScreen.GetHdc();
IntPtr hDCBmp = gBmp.GetHdc();

BitBlt(hDCBmp,
0,
0,
Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height,
hDCScreen,
0,
0,
SRCCOPY);

gScreen.ReleaseHdc(hDCScreen);
gBmp.ReleaseHdc(hDCBmp);

return bmpScreen;
}
gg00xiv Messages postés 656 Date d'inscription mercredi 22 août 2001 Statut Membre Dernière intervention 11 mars 2005 13
3 déc. 2003 à 11:34
c optimal :)
sergebre Messages postés 10 Date d'inscription vendredi 20 juin 2003 Statut Membre Dernière intervention 26 décembre 2003
2 déc. 2003 à 23:23
c'est compliqué !
gg00xiv Messages postés 656 Date d'inscription mercredi 22 août 2001 Statut Membre Dernière intervention 11 mars 2005 13
1 déc. 2003 à 20:51
je suis pas tres claire effectivement, mais je ne parlerer pas de l'API windows sur ce site, c pas fe pour, regarde la msdn si t interesser par le code de la fonction. Je n'ai appris ces fonctions que pour faire une partie d'un projet plus important donc je suis pas tres bien calé la dedans.

J'ai poster surtout pour fournir une methode simple d'utilisation du screenshot memoire en .NET
Dereckson Messages postés 3 Date d'inscription mercredi 12 novembre 2003 Statut Membre Dernière intervention 8 octobre 2006
1 déc. 2003 à 15:36
// 1) sa selectionne le bitmap passe en parametre
// 2) selectobject renvoi le handle du bitmap precedemment selectionne
// qui etait le bitmap par defaut (qui contient rien)

Tu peux faire un petit effort de français dans tes commentaires ? ;)
Rejoignez-nous