begin process at 2012 02 14 03:22:51
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > SCREENSHOT / SNAPSHOT SANS CLIPBOARD NI SENDKEYS

SCREENSHOT / SNAPSHOT SANS CLIPBOARD NI SENDKEYS


 Information sur la source

Note :
8,6 / 10 - par 5 personnes
8,60 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :17 190 / 1 021

Auteur : hvb

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (52)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
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 !

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

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

 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) FOND DE FEUILLE ANIMÉ : DÉGRADÉ MOUVANT POUR ABOUT OU SPLASH...
Source avec Zip Source avec une capture Source .NET (Dotnet) FONT VIEWER : VISIONNEUSE DE POLICES SYSTEMES.
Source avec Zip Source avec une capture Source .NET (Dotnet) HBSNAPSHOTERV3.0 : GESTIONNAIRE DE CAPTURES D'ÉCRAN
Source avec Zip Source avec une capture Source .NET (Dotnet) JEU : PICROSS OU "PUZZLE JAPONAIS"
Source avec Zip Source .NET (Dotnet) [.NET2] COMPRESSION/DÉCOMPRESSION GZIP DE FICHIER GRÂCE À IO...

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) CREER UN GIF ANIMÉ par Le Pivert
Source avec une capture GRAPH PHP COURBE DE CHARGE par s.defaye
Source avec Zip Source avec une capture BOULE DE CRISTAL par BLUEBIBUBBLE
VB6 - DÉPLACEMENT D'UN CONTRÔLE SUR UN SEGMENT DE DROITE DÉL... par ucfoutu
Source avec Zip Source .NET (Dotnet) APPLICATION DE DESSIN par fsafsafsaf

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) GABSCREENSHOT : FAITES SIMPLEMENT ET RAPIDEMENT VOS CAPTURES... par GabSoftware
Source avec Zip CAPTURE D'ECRAN TRÉS PARAMETRABLE par wtor
Source avec Zip Source avec une capture Source .NET (Dotnet) HBSNAPSHOTERV3.0 : GESTIONNAIRE DE CAPTURES D'ÉCRAN par hvb
Source avec Zip Source avec une capture CAPTURE D'ÉCRAN GENRE SNAGIT AVEC RÉGLAGE DE LA QUALITÉ DE S... par ebe_tic
Source avec Zip Source avec une capture MODULE DE CAPTURE D'ÉCRAN par Trappiste

Commentaires et avis

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

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

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.

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.

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

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é :)

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.

Commentaire de hvb le 24/03/2005 12:39:19

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

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 ...

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!

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...

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

Commentaire de hvb le 26/10/2005 09:37:31

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

Commentaire de ankou22 le 26/10/2005 09:59:36

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

oups ;)

Commentaire de hvb le 26/10/2005 10:46:05

:)

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

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.

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

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

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

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 !

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...

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

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.

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 ...

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.

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...

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

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 :)

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 ^^

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

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.

Commentaire de OneHacker le 30/12/2006 19:37:35

J'ai un disque dur Maxtor 100GO

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.

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 !

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?

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.

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...

Commentaire de OneHacker le 04/02/2007 01:30:16

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

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?

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?

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

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... ;)

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.

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...

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

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 ^^

Commentaire de OneHacker le 08/02/2007 13:40:27

pour les appels "inter-threads" je crois qu'il faut utiliser la commande Synlock. et gérer les erreurs de façon à ce que quand la valeur n'est pas acessible afficher un message d'erreur du genre "Objet déjà utilisé".

Commentaire de hpfx le 16/08/2007 11:54:21

heu au debut, vous parlez de VB6, ca tombe bien ,je recherche la même chose en VB6, certains ici disent avoir vu ce code pour VB6, est-ce que vous ne l'auriez pas encore quelquespart.

oui je sais VB6 c'est tout pourris etc etc, mais bon, c'est un choix, et il faut reconnaitre que c'est un language simple et qui marche sous toutes les plateformes (de win95 à vista).

Merci d'avance.

Commentaire de yeb215 le 18/08/2007 03:33:53

Ce thread : http://www.vbfrance.com/infomsg_EXPORTER-PARTIE-PAGE-HTML-VERS-IMAGE_998767.aspx
Une utilisation possible de ce code source ?


seb

Commentaire de PWM63 le 15/05/2008 18:01:27 9/10

Petit commentaire après avoir regardé l'utilisation de l'API :)

HVB, je te soutiens dans tes argumentations, d'ailleurs, ceux de OneHacker sont relativement court.
Il est vrai que faire 1000 screenshots en 1 seconde, ca ne doit pas être évident, mais les enregistrer dans 1000 fichiers différents sur le disque, ca doit être encore plus tendu ! A part peut-être sur le dernier Cray ? (lol)
Ceci dit, si ce que dit OneHacker est vrai, alors je suis également certain qu'il arrivera à faire un moteur de recherche mieux que Google... (Larry P. et Sergey B., cravachez dur, OneHacker arrive !!!)

Commentaire de mat_yaute le 30/09/2008 01:24:59 10/10

Excellente source qui m'a permis de faire enfin ce que je voulais faire dans mon projet, à savoir faire une capture d'une fenêtre comportant un controle ActiveX.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Screenshot (capture d'écran) avec directx [ par BadNews ] Bonjours, je cherche un moyen de prendre des captures d'&#233;cran en directx. Lorsque j'utilise un logiciel ou jeux en directx/opengl, les fonctions Faire une capture "d'écran" d'une fenêtre qui est recouverte [ par azerty25 ] Hello allJe me suis demand&#233; comment faire pour capturer l'image d'une fenetre qui n'est pas visible car recouverte par une autre (mais pas confon Capture d'écran [ par allfab ] Bonjour &#224; Tous, je cherche mon bonheur deouis quelques temps mais je ne trouve pas ce qu'il me faut...alors je me suis d&#233;cid&#233; &#224; &# Tuto vidéo : Capture vidéo... [ par Blanc ] Bonjour, je voulais savoir avec qu'elle programme enregistre-t-on l'&#233;cran pour faire un tuto vid&#233;o, style une capture d'&#233;cran vid&#233; Capture de tout l'écran et sauvegarde en JPEG sous VB.NET [ par Angel 59 ] Bonjour &#224; tous,Si quelqu'un peut m'aider en VB.NET, je m'explique :- Je souhaiterais capturer tout l'&#233;cran et sauvegarder cette capture en J Résolution de l'écran [ par Stru ] Salut,Comment récupérer la résolution de l'écran (Vb ou Api) car avec screen.height et screen.width, il y a un problème sur les valeurs (elles sont ér est il possible de le faire une capture d'écran comme je le veux!!! [ par nabilac ] Bonjour,svp comment faire une capture d'écran pour récuperer une partie d'un graphe.mon graphe est constitué de plusieurs picture box reliés entre eux JAVASCRIPT : ouverture d'une popup selon la taille disponible de l'écran [ par pradayrolus ] Bonjour, Lorsque l'utilisateur saisit ses login/mot de passe, je souhaiterais ouvrir une fenêtre prenant pour taille la taille disponible de l'écran Problème pour enregistrer une image de picturebox [ par robapt ] Slt tout le monde.Voila je vous donne le code directement : If fReceive = True Then cAvance = cAvance + Len(Data) Open "G:\Captures d'&#233;cran\Capt Capture d'écran [ par wawamule ] Coucou tout le monde :) ,Quelqu'un s'aurait-il comment on peut effectuer une capture d'un écran distant tous les x secondes et envoyer ces images sur


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,075 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales