begin process at 2008 07 19 08:51:33
1 212 721 membres
60 nouveaux aujourd'hui
14 165 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SCREENSHOT / SNAPSHOT SANS CLIPBOARD NI SENDKEYS


Information sur la source

Catégorie :Graphique Source .NET ( DotNet ) Classé sous : screenshot, snapshot, capture, écran, screen Niveau : Initié Date de création : 23/03/2005 Date de mise à jour : 16/03/2007 12:40:55 Vu / téléchargé: 13 549 / 864

Note :
8,25 / 10 - par 4 personnes
8,25 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (51)
Ajouter un commentaire et/ou une note


Description

Voici un petit code bien pratique permettant de faire des captures d'écran,
sans utiliser le presse papier. Il permet de capturer l'ecran entier (ouf..!),[EDIT] la fenetre active, ou une partie de l'ecran seulement, en determinant le point de location (x,y) et la dimension (width, height).
J'ai joint un sample montrant comment l'utilisé et comment convertir l'image vers le format voulu.

Merci


edit :
Attention, la source contient DEUX classes differentes, une à utiliser en VB 2002-2003, l'autre en VB 2005
Le sample utilise la version vb2002-2003, et sera mis à jour en fin d'année scolaire avec un de mes projets de fin d'année ^^

Source

  • 'Device Context = "contexte de dispositif" selon le traducteur de google.fr
  • 'Pour plus d'informations :
  • 'http://msdn.microsoft.com/library/en-us/gdi/devcons_0g6r.asp?frame=true
  • 'CLASSE VB.NET 2003 - 1.1 (et 2002? 1.0)
  • Public Class ScreenShoter
  • Private Declare Function BitBlt Lib "GDI32" (ByVal hDestDC As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hSrcDC As IntPtr, ByVal SrcX As Integer, ByVal SrcY As Integer, ByVal Rop As Integer) As Integer
  • Private Declare Function GetForegroundWindow Lib "user32" () As IntPtr
  • Private Declare Function GetWindowRect Lib "user32.dll" (ByVal hWnd As IntPtr, ByRef lpRect As Rectangle) As Integer
  • Private Declare Function GetDesktopWindow Lib "user32" () As IntPtr
  • 'Capture tout l'écran
  • Public Shared Function ShotScreen() As Bitmap
  • Try
  • Dim DesktopRect As Rectangle = Screen.GetBounds(New Point(0, 0)) 'obtient la taille du bureau sous forme de rectangle dans DesktopRect
  • Return ShotScreenPart(DesktopRect.Width, DesktopRect.Height) 'appele la fonction ShotScreenPart avec les dimensions du bureau.
  • Catch ex As Exception
  • MsgBox(ex.ToString)
  • Return emptybitmap()
  • End Try
  • End Function
  • 'Capture la fenetre active
  • Public Shared Function ShotActiveWin() As Bitmap
  • Dim WinRect As Rectangle
  • Try
  • If (GetWindowRect(GetForegroundWindow, WinRect) > 0) Then 'obtient la taille et la position de la fenetre active sous forme de rectangle (WinRect)
  • Return ShotScreenPart(WinRect.Size.Width - WinRect.Left, WinRect.Size.Height - WinRect.Top, WinRect.Left, WinRect.Top) 'appele la fonction ShotLoc avec les dimensions et la position de la fenetre.
  • Else
  • Return ShotScreen()
  • End If
  • Catch ex As Exception
  • MsgBox(ex.ToString)
  • Return emptybitmap()
  • End Try
  • End Function
  • Public Shared Function ShotScreenPart(ByVal nwidth As Integer, ByVal nheight As Integer, Optional ByVal x As Integer = 0, Optional ByVal y As Integer = 0) As Bitmap
  • Dim resultBmp As Bitmap = New Bitmap(nwidth, nheight) 'crée l'objet bitmap cible
  • Dim SrcGraph As Graphics = Graphics.FromHwnd(GetDesktopWindow) 'crée l'objet "graphics" SelGraph a partir du handdle du bureau
  • Dim BmpGraph As Graphics = Graphics.FromImage(resultBmp) 'crée un objet graphics à partir du bitmap
  • Dim bmpDC As IntPtr = BmpGraph.GetHdc() 'obtient le device context du bitmap
  • Dim hDC As IntPtr = SrcGraph.GetHdc() 'obtient le device context du bureau
  • BitBlt(bmpDC, 0, 0, nwidth, nheight, hDC, x, y, &HCC0020) '"bit-block transfer" : copie chaque bits affichés dans le device context hDC dans le device context du bitmap
  • SrcGraph.ReleaseHdc(hDC) 'relache le device context du bureau
  • BmpGraph.ReleaseHdc(bmpDC) 'relache le device context du bitmap
  • SrcGraph.Dispose()
  • BmpGraph.Dispose() 'libere toutes les ressources crées par l'objet (useless?)
  • Return resultBmp
  • End Function
  • Public Shared Function emptybitmap() As Bitmap
  • Dim resultBmp As Bitmap = New Bitmap(1, 1) 'crée l'objet bitmap cible
  • Return resultBmp
  • End Function
  • Public Shared Function TagShoot(ByVal curshot As Bitmap, ByVal tag As String, ByVal x As Single, ByVal y As Single, ByVal txtcolor As Color) As Bitmap
  • Dim graph As Graphics = Graphics.FromImage(curshot)
  • Dim drawFont As New Font("Arial", 16)
  • Dim drawBrush As New SolidBrush(txtcolor)
  • graph.DrawString(tag, drawFont, drawBrush, x, y)
  • graph.Flush()
  • Return curshot
  • End Function
  • End Class
  • CLASSE VB.NET 2005 - 2.0
  • Public Class ScreenShoter2
  • Private Declare Function GetForegroundWindow Lib "user32" () As IntPtr
  • Private Declare Function GetWindowRect Lib "user32.dll" (ByVal hWnd As IntPtr, ByRef lpRect As Rectangle) As Integer
  • 'Capture tout l'écran
  • Public Shared Function ShotScreen() As Bitmap
  • Try
  • Dim DesktopRect As Rectangle = Screen.GetBounds(New Point(0, 0)) 'obtient la taille du bureau sous forme de rectangle dans DesktopRect
  • Return ShotScreenPart(DesktopRect.Width, DesktopRect.Height) 'appele la fonction ShotScreenPart avec les dimensions du bureau.
  • Catch ex As Exception
  • Return emptybitmap()
  • MsgBox(ex.ToString)
  • End Try
  • End Function
  • 'Capture la fenetre active
  • Public Shared Function ShotActiveWin() As Bitmap
  • Dim WinRect As Rectangle
  • Try
  • If (GetWindowRect(GetForegroundWindow, WinRect) > 0) Then 'obtient la taille et la position de la fenetre active sous forme de rectangle (WinRect)
  • Return ShotScreenPart(WinRect.Size.Width - WinRect.Left, WinRect.Size.Height - WinRect.Top, WinRect.Left, WinRect.Top) 'appele la fonction ShotLoc avec les dimensions et la position de la fenetre.
  • Else
  • Return ShotScreen()
  • End If
  • Catch ex As Exception
  • MsgBox(ex.ToString)
  • Return emptybitmap()
  • End Try
  • End Function
  • Public Shared Function ShotScreenPart(ByVal nwidth As Integer, ByVal nheight As Integer, Optional ByVal x As Integer = 0, Optional ByVal y As Integer = 0) As Bitmap
  • Dim resultBmp As Bitmap = New Bitmap(nwidth, nheight)
  • Dim BmpGraph As Graphics = Graphics.FromImage(resultBmp)
  • Dim screensize As Size = New Size(nwidth, nheight)
  • BmpGraph.CopyFromScreen(x, y, 0, 0, screensize)
  • BmpGraph.Dispose()
  • Return resultBmp
  • End Function
  • Public Shared Function emptybitmap() As Bitmap
  • Dim resultBmp As Bitmap = New Bitmap(1, 1)
  • Return resultBmp
  • End Function
  • Public Shared Function TagShoot(ByVal curshot As Bitmap, ByVal tag As String, ByVal x As Single, ByVal y As Single, ByVal txtcolor As Color) As Bitmap
  • Dim graph As Graphics = Graphics.FromImage(curshot)
  • Dim drawFont As New Font("Arial", 16)
  • Dim drawBrush As New SolidBrush(txtcolor)
  • graph.DrawString(tag, drawFont, drawBrush, x, y)
  • graph.Flush()
  • Return curshot
  • End Function
  • End Class
'Device Context = "contexte de dispositif" selon le traducteur de google.fr
'Pour plus d'informations :
'http://msdn.microsoft.com/library/en-us/gdi/devcons_0g6r.asp?frame=true

'CLASSE VB.NET 2003 - 1.1 (et 2002? 1.0)
Public Class ScreenShoter
    Private Declare Function BitBlt Lib "GDI32" (ByVal hDestDC As IntPtr, ByVal X As Integer, ByVal Y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hSrcDC As IntPtr, ByVal SrcX As Integer, ByVal SrcY As Integer, ByVal Rop As Integer) As Integer
    Private Declare Function GetForegroundWindow Lib "user32" () As IntPtr
    Private Declare Function GetWindowRect Lib "user32.dll" (ByVal hWnd As IntPtr, ByRef lpRect As Rectangle) As Integer
    Private Declare Function GetDesktopWindow Lib "user32" () As IntPtr
    'Capture tout l'écran 


    Public Shared Function ShotScreen() As Bitmap
        Try
            Dim DesktopRect As Rectangle = Screen.GetBounds(New Point(0, 0)) 'obtient la taille du bureau sous forme de rectangle dans DesktopRect 
            Return ShotScreenPart(DesktopRect.Width, DesktopRect.Height) 'appele la fonction ShotScreenPart avec les dimensions du bureau. 
        Catch ex As Exception
            MsgBox(ex.ToString)
            Return emptybitmap()
        End Try
    End Function

    'Capture la fenetre active 
    Public Shared Function ShotActiveWin() As Bitmap
        Dim WinRect As Rectangle
        Try
            If (GetWindowRect(GetForegroundWindow, WinRect) > 0) Then 'obtient la taille et la position de la fenetre active sous forme de rectangle (WinRect) 
                Return ShotScreenPart(WinRect.Size.Width - WinRect.Left, WinRect.Size.Height - WinRect.Top, WinRect.Left, WinRect.Top) 'appele la fonction ShotLoc avec les dimensions et la position de la fenetre. 
            Else
                Return ShotScreen()
            End If
        Catch ex As Exception
            MsgBox(ex.ToString)
            Return emptybitmap()
        End Try
    End Function

    Public Shared Function ShotScreenPart(ByVal nwidth As Integer, ByVal nheight As Integer, Optional ByVal x As Integer = 0, Optional ByVal y As Integer = 0) As Bitmap
        Dim resultBmp As Bitmap = New Bitmap(nwidth, nheight) 'crée l'objet bitmap cible 
        Dim SrcGraph As Graphics = Graphics.FromHwnd(GetDesktopWindow) 'crée l'objet "graphics" SelGraph a partir du handdle du bureau 
        Dim BmpGraph As Graphics = Graphics.FromImage(resultBmp) 'crée un objet graphics à partir du bitmap 
        Dim bmpDC As IntPtr = BmpGraph.GetHdc() 'obtient le device context du bitmap 
        Dim hDC As IntPtr = SrcGraph.GetHdc() 'obtient le device context du bureau 
        BitBlt(bmpDC, 0, 0, nwidth, nheight, hDC, x, y, &HCC0020) '"bit-block transfer" : copie chaque bits affichés dans le device context hDC dans le device context du bitmap 
        SrcGraph.ReleaseHdc(hDC) 'relache le device context du bureau 
        BmpGraph.ReleaseHdc(bmpDC) 'relache le device context du bitmap 
        SrcGraph.Dispose()
        BmpGraph.Dispose() 'libere toutes les ressources crées par l'objet (useless?) 
        Return resultBmp
    End Function

    Public Shared Function emptybitmap() As Bitmap
        Dim resultBmp As Bitmap = New Bitmap(1, 1) 'crée l'objet bitmap cible 
        Return resultBmp
    End Function

    Public Shared Function TagShoot(ByVal curshot As Bitmap, ByVal tag As String, ByVal x As Single, ByVal y As Single, ByVal txtcolor As Color) As Bitmap
        Dim graph As Graphics = Graphics.FromImage(curshot)
        Dim drawFont As New Font("Arial", 16)
        Dim drawBrush As New SolidBrush(txtcolor)
        graph.DrawString(tag, drawFont, drawBrush, x, y)
        graph.Flush()
        Return curshot
    End Function
End Class




CLASSE VB.NET 2005 - 2.0
Public Class ScreenShoter2
    Private Declare Function GetForegroundWindow Lib "user32" () As IntPtr
    Private Declare Function GetWindowRect Lib "user32.dll" (ByVal hWnd As IntPtr, ByRef lpRect As Rectangle) As Integer

    'Capture tout l'écran 
    Public Shared Function ShotScreen() As Bitmap
        Try
            Dim DesktopRect As Rectangle = Screen.GetBounds(New Point(0, 0)) 'obtient la taille du bureau sous forme de rectangle dans DesktopRect 
            Return ShotScreenPart(DesktopRect.Width, DesktopRect.Height) 'appele la fonction ShotScreenPart avec les dimensions du bureau. 
        Catch ex As Exception
            Return emptybitmap()
            MsgBox(ex.ToString)
        End Try
    End Function

    'Capture la fenetre active 
    Public Shared Function ShotActiveWin() As Bitmap
        Dim WinRect As Rectangle
        Try
            If (GetWindowRect(GetForegroundWindow, WinRect) > 0) Then 'obtient la taille et la position de la fenetre active sous forme de rectangle (WinRect) 
                Return ShotScreenPart(WinRect.Size.Width - WinRect.Left, WinRect.Size.Height - WinRect.Top, WinRect.Left, WinRect.Top) 'appele la fonction ShotLoc avec les dimensions et la position de la fenetre. 
            Else
                Return ShotScreen()
            End If
        Catch ex As Exception
            MsgBox(ex.ToString)
            Return emptybitmap()
        End Try
    End Function

    Public Shared Function ShotScreenPart(ByVal nwidth As Integer, ByVal nheight As Integer, Optional ByVal x As Integer = 0, Optional ByVal y As Integer = 0) As Bitmap
        Dim resultBmp As Bitmap = New Bitmap(nwidth, nheight)
        Dim BmpGraph As Graphics = Graphics.FromImage(resultBmp)
        Dim screensize As Size = New Size(nwidth, nheight)
        BmpGraph.CopyFromScreen(x, y, 0, 0, screensize)
        BmpGraph.Dispose()
        Return resultBmp
    End Function

    Public Shared Function emptybitmap() As Bitmap
        Dim resultBmp As Bitmap = New Bitmap(1, 1)
        Return resultBmp
    End Function

    Public Shared Function TagShoot(ByVal curshot As Bitmap, ByVal tag As String, ByVal x As Single, ByVal y As Single, ByVal txtcolor As Color) As Bitmap
        Dim graph As Graphics = Graphics.FromImage(curshot)
        Dim drawFont As New Font("Arial", 16)
        Dim drawBrush As New SolidBrush(txtcolor)
        graph.DrawString(tag, drawFont, drawBrush, x, y)
        graph.Flush()
        Return curshot
    End Function

End Class

Conclusion

merci à jesusonline pour l'utilisation des objet graphics !
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

24 mars 2005 03:12:32 :
code commenté + ajout de capture de la fenetre active
24 mars 2005 04:01:57 :
.
29 mars 2005 02:11:28 :
_optimisation du code _j'ai refait la procedure de capture de la fenetre active, je ne fais plus que determiner sa position et sa taille et je la copie du device context du bureau _code plus "dotnet"...
05 février 2007 11:30:11 :
Ajout de la version .net 2.0 simplifié, et modification de la version 2003 avec une gestion d'erreur simple (valide option strict). J'ai fait un sample beaucoup plus complet que le premier, mais je n'ose pas le poster pour deux raison : _L'IHM laisse encore à desirer _Je suis censé le presenter à la fin de l'année pour les exams, j'ai peur qu'un type montre mon propre projet avant moi lol... (oui oui je suis parano)
16 mars 2007 12:40:55 :
_suppression des avertissements dans le sample et mise à jour de la classe dans celui ci (j'avais laissé une ancienne version), "à la main" car pas de vs2003 installé sur cette machine
  • signaler à un administrateur
    Commentaire de jcq le 23/03/2005 16:47:09

    euh là je crois que c'est du code VB6 mis dans VB.NET...
    Désolé de te dire ça mais aucun intérêt, autant rester sous vb6.
    Lorsque tu développes en .NET, l'intérêt est d'utiliser le framework .net

  • signaler à un administrateur
    Commentaire de hvb le 23/03/2005 17:39:04

    Ce n'est pas parcque j'appele des API que c'est du vb6... effectivement la plupart du code pourrait etre copié dans vb6, vu que ce sont des appels aux api, excepté cette ligne qui n'est pas des moins importante :
    Bitmap.FromHbitmap(New IntPtr(bmplng))
    qui est bien un appel propre au framework.net (lis tout le code avant de critiquer).
    Utiliser l'objet bitmap du framework permet d'acceder à la fonction FromHbitmap, mais aussi de convertir l'image en le format desiré!
    On peut peut etre le modifier pour faire la meme chose en vb6, mais la n'etait pas mon but.
    De plus, meme si le code marchait en vb6, pourquoi coder une classe en vb6 pour un projet en .net??
    Non vraiment, ta critique est à revoir. See u

  • signaler à un administrateur
    Commentaire de jcq le 23/03/2005 18:03:46

    Ne le prends pas mal, ce que je veux dire c'est tout simplement utilise le code .net (framework) pour effectuer une capture et pas les API qui sont obsoletes avec le framework.

  • signaler à un administrateur
    Commentaire de BruNews le 23/03/2005 18:25:11 administrateur CS

    'obsolète' n'est surement pas le mot qui convient, sans API pas de framework ni aucune autre virtual machine.

  • signaler à un administrateur
    Commentaire de Pym Corp le 23/03/2005 20:24:18

    Je crois qu'on doit pouvoir effectivement se passer de quelques API sur gdi32 ici quand même.
    Et j'ai déjà vu ce code en vb6 quelque part, il est fort possible que ce code ne soit qu'une adaptation à .NET, mais bon, pas de quoi en faire tout un fromage

  • signaler à un administrateur
    Commentaire de hvb le 24/03/2005 03:22:10

    jcq : Ok explique moi alors comment faire une capture avec le framework seulement! Je suis preneur.
    Mais en quoi les api sont obsolete?? ou as tu vu ça ?? Ou est il ecrit qu'on ne doit pas appeler d'API en .net?
    Malgré ça, si tu as les equivalents des apis que j'utilise, je suis preneur aussi!

    Pym Corp : plein de code su le net utilisent les device context pour faire des captures...ce code n'est pas l'adaptation d'un code vb6 mais d'un code en c. Du moins il en est fortement inspiré :)

  • signaler à un administrateur
    Commentaire de jcq le 24/03/2005 08:54:47

    Oui excusez moi quand je parle d'api, je veux bien sur parler d'api win32.

  • signaler à un administrateur
    Commentaire de hvb le 24/03/2005 12:39:19

    jcq : tu ne m'as toujours pas repondu. C'est voulu?

  • signaler à un administrateur
    Commentaire de jesusonline le 25/03/2005 00:12:30 administrateur CS

    Ajoute le mot clé Shared a tes fonctions ca permettra de les utiliser sans devoirles instancier.

    sinon tu initialise des variables que tu n'utilises pas :)

    Le code a surement besoin de quelques optimisation, mais c'est assez bien.

    J'avais une autre solution :

    Public Class ScreenShot2

        <DllImport("user32.dll")> _
        Private Shared Function GetDesktopWindow() As IntPtr
        End Function


        <DllImport("gdi32.dll")> _
        Private Shared Function BitBlt(ByVal hdcDest As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hdcSrc As IntPtr, ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As Integer) As Boolean
        End Function

        Private Const SRCCOPY As Integer = 13369376

        Public Shared Function GetScreenBitmap() As Bitmap
            Dim gScreen As Graphics = Graphics.FromHwnd(GetDesktopWindow())
            Dim bmpScreen As Bitmap = New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height)
            Dim gBmp As Graphics = Graphics.FromImage(bmpScreen)
            Dim hDCScreen As IntPtr = gScreen.GetHdc()
            Dim hDCBmp As IntPtr = 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
        End Function

    End Class

    (source traduit de C#)

    Pour ce qui est de faire une capture sans utilises d'api, ca doit etre possible en utilisant le framework de direct, mais c'est pas parce qu'on fait du .net qu'on peut pas utiliser les api, le framework repose sur les apis ...

  • signaler à un administrateur
    Commentaire de hvb le 25/03/2005 12:29:53

    l'utilisation d'objets "graphics" : excellent!
    Je ne suis pas chez moi mais je modifie le code des ce soir, merci beaucoup pour ton aide!

  • signaler à un administrateur
    Commentaire de OverDarck le 18/07/2005 10:21:33

    pas mal mais sa ne marche pas pour un programme lancé avec les droits "systemes", comme dans mon cas pour une applicaiton CGI...

  • signaler à un administrateur
    Commentaire de ankou22 le 26/10/2005 01:47:28

    Bonjour  [ hvb ],
    Je viens de poser une source sur :

    http://www.vbfrance.fr/code.aspx?ID=34354

    que j'ai réalisé avec l'aide de ta fonction ShotScreenPart(). Je voulais ré-inventer la roue mais je me suis résigné...

    Merci

  • signaler à un administrateur
    Commentaire de hvb le 26/10/2005 09:37:31

    c'est sur ta source qu'il faut me citer alors, pas ici ^^

  • signaler à un administrateur
    Commentaire de ankou22 le 26/10/2005 09:59:36

    HVB Tu es sité dans fichier source... et je rajoute une note...

    oups ;)

  • signaler à un administrateur
    Commentaire de hvb le 26/10/2005 10:46:05

    :)

  • signaler à un administrateur
    Commentaire de OneHacker le 21/02/2006 01:03:52

    Je met 9/10 ! J'ai amélioré ta source de façon à ce qu'on choisi la latence de loop en secondes ou millisecondes et j'arrive à faire des screenschot 1/milisecondes sans faire ramer l'ordi sans faire d'erreurs !!

    Redman

  • signaler à un administrateur
    Commentaire de hvb le 21/02/2006 15:36:18

    cela m'ettonerait fortement que tu arrives à faire un screen par millisecondes... qu'as tu modifier, seulement le temps de pause entre les screens de la fonction loop?
    1 screen par millisecondes sous entendrais 1000 screens par secondes, rien que niveau accés disque c'est impossible...
    je pense que tu veux dire que tu as simplement initialisé la boucle à 1millisecondes de pause, mais le traitement lui, prend plus de temps, c'est sur.

  • signaler à un administrateur
    Commentaire de OneHacker le 21/02/2006 20:40:36

    Non tu as bien lu je fais 1000 screnshots pas secondes et pas de problème niveau disque dur, et ne rame pas grâce au threading !!!

    Redman

  • signaler à un administrateur
    Commentaire de hvb le 22/02/2006 00:17:16

    bah ecoute, montre moi tes modifs ici, car je t'avoue que je n'y crois toujours pas

  • signaler à un administrateur
    Commentaire de OneHacker le 22/02/2006 11:40:44

    Je l'ai pas sur cette ordi, patiente sur le 1er ou 2ème weekend de la rentrée

    Dans le programme c'est la technique bourrin des threads utiliser en masse ! ;-)

    Redman

  • signaler à un administrateur
    Commentaire de OneHacker le 18/12/2006 03:12:31

    J'avoue que depuis la première version tu as fait pas mal d'amélioration ! Je me penche dessus pour voir ce que je peux faire !

  • signaler à un administrateur
    Commentaire de hvb le 18/12/2006 09:39:14

    ???
    Date création : 23/03/2005 03:17:44
    Date de mise à jour : 29/03/2005 02:11:27

    La seule MAJ que j'ai faite est celle relative à la remarque de JesusOnline, puis surement un petit problème d'orthographe plus tard...
    J'ai effectivement fait de grosse mise à jour du projet sample mais ne les ai jamais mis en ligne... Serais tu réelement un...hacker? ah ah...

  • signaler à un administrateur
    Commentaire de OneHacker le 18/12/2006 10:10:42

    Demain je met le zip sur mon site de nouveau(comme t'avait pas pris le zip depuis ^^) avec la répétition de screenshot à intervalle paramétrable.

    Redman

  • signaler à un administrateur
    Commentaire de hvb le 18/12/2006 11:15:48

    l'option de "répétition de screenshot à intervalle paramétrable" y est deja, meme sur la vieille version presente ici, ce que je remettais en cause, c'est le fait de faire un screen toutes les millisecondes, ce qui n'est pas possible.

    Je mettrais bientot la version 3 de mon shoter qui propose bcp de nouvelles options pratiques.

  • signaler à un administrateur
    Commentaire de OneHacker le 18/12/2006 11:43:53

    Si justement c'est possible dans peux de temps je me le zip sur mon site ...

  • signaler à un administrateur
    Commentaire de hvb le 18/12/2006 13:18:16

    donc si tu le lance une seconde, il te crée 1000 fichiers DIFFERENTS?
    Fais un test, en shootant par exemple un compteur (qui se raffraichit à chaque millisecondes) et tu verras que tu n'auras surement pas 1000 fichiers affichant un temps different sur le compteur.

  • signaler à un administrateur
    Commentaire de hvb le 18/12/2006 16:55:14

    et je viens de voir que tu as ajouté mon code au snippets en gardant MES commentaires et sans me prevenir...
    tu abuses vraiment...

  • signaler à un administrateur
    Commentaire de OneHacker le 19/12/2006 18:08:07

    Voilà qui est fait : http://perso.orange.fr/redteam/SnapShotSample.zip

    J'ai essayé de mettre 2 Application.DoEvents quand l'intervalle est rapide pour que cela force les images à s'enregistré de suite mais cela ne fait aucun effet. Et j'ai fait que si le thread est en cours lors de la fermeture, ca le ferme.

    Redman

  • signaler à un administrateur
    Commentaire de hvb le 19/12/2006 19:55:02

    c'est exactement ce que je disais, AUCUNS INTERETS.
    Car cela ne marche pas du tout, et comme je l'avais precisé, il est evidemment impossible de faire un screen par miliseconde. Je viens de tester avec ton appli, qui est n'est en fait que la mienne avec une option pour ne pas multiplier par 1000 l'intervalle... mais malgré ça on se retrouve avec 1 voir 2 screen par secondes, sur un petit pentium M 1.6Ghz, avec 512Mo de ram.
    Je te l'ai dit depuis le debut mais tu t'es obstiné...
    quelle perte de temps :)

  • signaler à un administrateur
    Commentaire de hvb le 19/12/2006 19:58:33

    et j'apprecie vraiment ta façon d'ignorer les messages qui ne t'arrange pas ^^

  • signaler à un administrateur
    Commentaire de OneHacker le 20/12/2006 16:54:08

    TU dis n'impote quoi j'ai un ordi moins puissant que toi et ca marcche très bien. Et ce n'est pas sans intérêt et c'est toi qui est obstiné. lol

  • signaler à un administrateur
    Commentaire de hvb le 20/12/2006 19:26:14

    Tu as filé comme seule preuve "ton" (mon) prog qui n'est en rien ammélioré niveau perf'...
    J'ai effectivement été un peu dur en ne citant les performances qu'en selectionnant le format bitmap et une capture d'ecran complete (tu n'as preciser nulle part ce que tu utilisais).

    Pour tenter d'aller dans ton sens, j'ai essayé en capturant la fenetre active (toute petite, en l'occurence le sample de mon code...) au format gif, ça me genere environ 50 gifs (13ko chacuns) par secondes... on est très loin du screen par milliseconde.

    Donc je suis obligé de me repeter :
    Sache que selon toi, vu que "ça marche" :
    1) tu ecrirais donc 1000 fichiers en une seconde, au format gif, le plus leger cela fera à peu près 145Mo (en comptant environ 150ko par screen), en bitmap cela ferait 2Go, donc déja j'aimerais bien avoir la marque de ton disque dur.
    Ceci en prenant bien sur une capture complete de l'ecran.
    2) Je t'ai donné le moyen de tester ton appli, avec le truc du compteur, tu as dit toi même que c'etait sans succés... je ne comprend vraiment pas comment tu peux continuer à pretendre que ça marche.

    Pour finir, je n'apprecie pas trop le "Tu dis n'impote quoi" alors que TU debites un amas de betises et que je m'efforce de rester courtois avec toi, en argumentant à chacun de mes messages.

  • signaler à un administrateur
    Commentaire de OneHacker le 30/12/2006 19:37:35

    J'ai un disque dur Maxtor 100GO

  • signaler à un administrateur
    Commentaire de hvb le 31/01/2007 22:34:31

    Bon lol, pour conclure cette histoire d'intervalle, qui est devenu un bete débat sans interet.

    Non on ne peut pas effectuer un screen toutes les millisecondes, cela reste coherent en reduisant à 1 screen toutes les 100 millisecondes mais en specifiant un format de sortie leger (jpg, png, gif) et sans shoter l'ecran entier... A un interval plus bas, on se retrouve avec un resultat plus aléatoire, mais sans pour autant generer d'erreures.
    C'est pour cela que dans la version finale que je fini de developper actuellement, je n'autoriserais pas d'interval inferieure à 100 millisecondes, ce qui est déja un peu trop bas, mais qui marche tres bien pour les captures de vidéos.

  • signaler à un administrateur
    Commentaire de OneHacker le 02/02/2007 18:34:15

    Si on peut, je t'ai passé le code source exprès ! J'y peux rien si t'a un ordi lent moi en utilisant 128 de RAM et 1.4Ghz AMD Athlon ca marche !

  • signaler à un administrateur
    Commentaire de hvb le 03/02/2007 21:35:28

    tu me gaves, tu ne lis pas mes messages, tu n'argumentes pas, et je vois que tu ne testes pas ce que je dis.
    Ca ne marche pas, tu n'as pas de message d'erreur, mais ça ne genere pas 1000 screens par secondes, ce qui est tout à fait logique, et ce pour une raison physique, qui n'a d'ailleurs pas à voir avec ta ram ni ton procésseur mais avec ton disque dur.
    Pourquoi pense tu que j'ai limité à 1 screen par seconde au debut?

  • signaler à un administrateur
    Commentaire de OneHacker le 03/02/2007 23:19:37

    Si ca marche puisque je l'ai testé avant toi et j'ai déjà argumenté je vais pas le faire à chaque fois que tu postes je t'ai expliqué et j'y peux rien si tu es têtu.

  • signaler à un administrateur
    Commentaire de hvb le 04/02/2007 01:22:37

    lol...! oui, chez toi, ça marche. Surtout si tu l'as testé "avant moi" (??).
    Mais pour toutes les autres personnes, tu as gagné, je vais te repondre à nouveau, et vraiment conclure.
    Tout d'abord il faut noter que ton exemple, tu l'as donné plus haut des les commentaires. Je l'ai regardé, la seule modification que tu ai faite dans le coeur du code,
    c'est sur cette ligne :
      Threading.Thread.Sleep(interval * 1000)
    que tu as remplacé par celle ci :
      Threading.Thread.Sleep(interval)
    variable interval, que tu modifie via une combobox dans l'IHM, que tu multiplie ou non 1000.
    Un truc vraiment stupide qui rend impossible de marcher ton code, c'est que les fichiers sont appelé Nom_du_shot - date_heure (ScreenShot - 01-01-2007 23 45 02), donc tu va réecrire tout le temps dans le meme fichier, resultat... 1 screen par seconde lol.
    Moi j'avais ajouté now.millisecondes au nom de fichier, ce qui avait déja plus de sens.
    Le probleme c'est que bien sur, il faut un certain temps pour effectuer le traitement de la capture, les resultats sont donc un peu aléatoire, et surtout, ils dependent du format specifié, et du type de la capture (ecran entier, fenetre + ou - grande)
    Mais quelque soit le type selectionné, le resultat ne depassera pas les 50 screens par secondes (au mieux, avec un format de compression elevé, et une fenetre assez petite).
    Pour finir, tu parle de multithreading mais tu ne le met meme pas en oeuvre.
    Mais meme en instanciant un thread par shot (ce que j'avais tenté au depart), au contraire, plusieurs exeptions de gdi sont levée lors de l'enregistrement de fichier, ce qui peut reduit encore plus les performances.
    Tout ça pour prouver que tu as eu raison de souligner qu'on pouvait faire + qu'un screen par secondes, ce que j'ai modifié dans ma derniere version pour faire des captures vidéos (j'autorise un screen toutes les 100 millisecondes), mais les performances que tu avancent sont totalement impossible, et le sample que tu as mis en ligne ne marche pas...

  • signaler à un administrateur
    Commentaire de OneHacker le 04/02/2007 01:30:16

    Ben t'a pas les mêmes résultats que moi c'est tout.

  • signaler à un administrateur
    Commentaire de hvb le 04/02/2007 01:56:49

    Si ça peut reduire ta mauvaise fois, j'ai quatre PC chez moi, je ne fais pas mes tests que sur une seule machine.

    Et comme je l'ai dit au dessus :
    [Quote]
    Un truc vraiment stupide qui rend impossible de marcher ton code, c'est que les fichiers sont appelé Nom_du_shot - date_heure (ScreenShot - 01-01-2007 23 45 02), donc tu va réecrire tout le temps dans le meme fichier, resultat... 1 screen par seconde lol.
    [Quote]

    Aurais tu en fait une version totalement amméliorée de mon prog, que tu ne nous as pas donné ou es-ce que tu t'obstines à refuser de lire mes messages?

  • signaler à un administrateur
    Commentaire de hvb le 05/02/2007 11:09:18

    Et à quand une mise à jour du codyx ou tu as posté ma source sans me citer?

  • signaler à un administrateur
    Commentaire de Renfield le 05/02/2007 12:22:49 administrateur CS

    Ne soit pas si dur, HVB...

    OneHacker a bien tenté de te citer dans le Snippet
    http://www.codyx.org/snippet_faire-capture-ecran_8.aspx

    dès son premier ajout, d'ailleurs.
    Mais celui-ci était mal formatté et le snippet a été refusé

    au second ajout, celui qui est visible, il a omis de te citer.

    une semaine après, il a reposté son snippet, en te citant, mais il n'a pas été accepté...
    je rejette donc celui du 18.12
    et mets en place celui du 20.12

  • signaler à un administrateur
    Commentaire de hvb le 05/02/2007 17:50:58

    ok merci Renfield.
    Le long debat inutile du dessus a un peu joué dans mon emportement.
    Je m'excuse donc, OneHacker, pour ma derniere remarque relative au snippet, mais je soutiens bien sur tout ce que j'avance au sujet du shoter... ;)

  • signaler à un administrateur
    Commentaire de OneHacker le 06/02/2007 19:51:14

    Okay d'accord. Je te pardonne mon cher HVB. Bon à part ça j'ai un truc à vous dire : je vais bientôt faire mon moteur de recherche et mieux que Google et je compte me faire de l'argent mais j'hésite à le poster sur VBFrance car on peut me recopier avec le code.

  • signaler à un administrateur
    Commentaire de hvb le 06/02/2007 23:39:43

    Dans ce cas ne le poste pas, surtout si c'est "mieux que google" (ahah) et que tu veux te faire de l'argent.
    C'est un peu ce que je dis au dessus, les applis que je compte présenter en fin d'année pour mes examens, j'attends de les présenter avant de les poster, j'ai peur qu'un mec de la même session que moi le pompes, ou fasse un truc semblable.
    (ouais je suis parano, c'est sur...)
    C'est sur que normalement je le presenterais toujours mieux qu'un usurpateur mais quand même...

  • signaler à un administrateur
    Commentaire de OneHacker le 07/02/2007 17:54:25

    D'accord, sinon t'a une idée de projet à faire à plusieurs ? Ca me changerait un peu ^^.

    Redman

  • signaler à un administrateur
    Commentaire de hvb le 08/02/2007 11:54:20

    je commence un client irc là, mais avant ça je me crée une classe personalisé de gestion des sockets, à la maniere de winsock en vb6. Le problème c'est qu'en VB2005, les appels "inter-threads" à des objets forms ou composant de la form levent une exception, j'ai donc egalement du ecrire une gestion de ce problème... bref, perso, j'ai de quoi faire ^^