Aspiscreen - capturer l'écran - la form

Soyez le premier à donner votre avis sur cette source.

Vue 6 324 fois - Téléchargée 779 fois

Description

[vb 5.0]
En relation avec mon programme Big Brother
Programme qui permet de prendre un Screenshot de 2 méthodes :
- l'une avec le Presse Papier
- la 2eme sans Presse Papier (plus sur, moins génant si l'uilisateur souhaite garder en mémoire son texte Word tapé en 40 mn plutôt que un screenshot de l'écran !)

Vous pouvez prendre l'écran en entier, ou bien juste la form.
L'image qui en ressort est une image au format Bitmap.

Le tout parait gros et incompréhensible mais c'est du a la grosseur des commentaires. Vous pouvez mettre ça dans un module, c'est surement plus facile !

Source / Exemple :


Il vous faut : 1 form(form1), 1 picturebox(Picture1) avec Autoredraw = True et Visible = False, 3 boutons (Command1, Command2, Command3), 1 cerveau, 10 doigts :p

Option Explicit
' **************** VARIABLES METHODE 1 ****************

'Cette fonction permet de simuler un appuis d'une touche.
'De cette manière, on va simuler l'appuis sur la touche
'Imprimer Ecran. Elle fonctionne avec 4 arguments :
' - bVk représente le nombre correspondant à la touche
'virtuelle.
' - bScan représente la valeur qui définie ce qui doit
'etre capturé : l'écran, l'application seulement etc...
' - dwFlags réprésente l'état de la touche (relevé appuyé)
'Non important ici
' - dwExtraInfo représente une valeur associée 32bit avec
'la touche virtuelle. Nom important ici
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

'Constante représentant la touche virtuelle Imprim écran
Const VK_SNAPSHOT As Byte = &H2C
'Constante réprésentant l'écran entier
Const ecran As Byte = 1
'Constante réprésentant la form seulement
Const onlyform As Byte = 0
' ******************* FIN METHODE 1 *******************
'
' **************** VARIABLES METHODE 2 ****************

'Fonction qui permet de retourner le handle du Bureau
'Et oui sous Windows le Bureau à un Handle
Private Declare Function GetDesktopWindow Lib "user32" () As Long

'Fonction qui recupere le contexte de périphérique de la
'fenêtre d'handle hwnd. (Voir plus loin pour comprendre)
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
'Fonction qui pour dire simple, transfert un rectangle d'une
'fenêtre dans une autre. Cela peut être traduit comme une
'copie de fenêtre.
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
'Fonction qui renvoit les dimensions de la fenêtre de handle
'hwnd
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
'Type RECT pour recevoir les données de la fonction GetWindowRect
Private Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End Type
' ******************* FIN METHODE 2 *******************

Private Sub Command1_Click()
    'Nettoie le buffer du presse papier
    Clipboard.Clear
    'Appel de la fonction : on simule l'appuis de la touche
    'Imprim écran, avec comme argument l'ecran seulement
    'Vous pouvez changer et imprimer la form avec l'argument
    'onlyform au lieu de ecran
    Call keybd_event(VK_SNAPSHOT, ecran, 0&, 0&)
    'Attends que Windows rafraichisse le Presse papier
    DoEvents
    'On récupère le buffer du Presse papier. (Notre image
    'doit s'y trouver)
    SavePicture Clipboard.GetData, App.Path & "\methode1.bmp"
End Sub

---------------------------------------------------------------------------------

Private Sub Command3_Click()
    'Nettoie le buffer du presse papier
    Clipboard.Clear
    'Appel de la fonction : on simule l'appuis de la touche
    'Imprim écran, avec comme argument l'ecran seulement
    'Vous pouvez changer et imprimer la form avec l'argument
    'onlyform au lieu de ecran
    Call keybd_event(VK_SNAPSHOT, onlyform, 0&, 0&)
    'Attends que Windows rafraichisse le Presse papier
    DoEvents
    'On récupère le buffer du Presse papier. (Notre image
    'doit s'y trouver)
    SavePicture Clipboard.GetData, App.Path & "\methode2(juste_form).bmp"
End Sub

---------------------------------------------------------------------------------

Private Sub Command2_Click()
Dim Suc, TwipsPerPixel, hwndsrc, hSrcDC, hdummy, xSrc, ySrc, nWidth, nHeight, hDestdc, x, y, Numpix, dwRop As Long
Dim winSize As RECT

    'On recupere le handle du bureau
    hwndsrc = GetDesktopWindow()
    'On recupere le contexte de périphérique de l'handle
    'ci avant.
    hSrcDC = GetDC(hwndsrc)
    'Dimensions définies à 0
    xSrc = 0: ySrc = 0
    'Recupere les dimensions du bureau, soit en fait celles
    'de l'écran (logique)
    hdummy = GetWindowRect(hwndsrc, winSize)
    'Ajustement des dimensions
    nWidth = winSize.Right
    nHeight = winSize.Bottom
    'Renvois un descripteur vers le contexte de périph
    'de la PictureBox
    'Explication donnée par VB pour être plus clair :
    '"La propriété hDC est un descripteur de contexte
    'de périphérique dans l'environnement d'exploitation
    'Microsoft Windows. Le système d'exploitation gère
    'l'affichage en affectant un contexte de périphérique
    'à l'objet Printer, à chaque feuille et à chaque
    'contrôle PictureBox d'une application. Vous pouvez
    'utiliser la propriété hDC pour faire référence au
    'descripteur associé au contexte de périphérique d'un
    'objet, ce qui vous permet de transmettre une valeur
    'aux appels de l’API de Windows."
    hDestdc = Picture1.hdc
    'Dimensions definies à 0
    x = 0
    y = 0
 
    'Recupération de valeur et ajustement pour le reste
    Form1.ScaleMode = 3
    Numpix = Form1.ScaleHeight
    Form1.ScaleMode = 1
    TwipsPerPixel = Form1.ScaleHeight / Numpix

    Picture1.Top = 0
    Picture1.Left = 0
    Picture1.Width = (nWidth + 1) * TwipsPerPixel
    Picture1.Height = (nHeight + 1) * TwipsPerPixel
    'Pour la fonction Bitblt, représente une valeur pour
    'ajuster la couleur. Il y en a des tonnes, exemple :
    'SRCAND,MERGEPAINT,BLACKNESS...
    dwRop = &HCC0020
    'Finalement on fait une copie de l'écran entier grace
    'aux infos récupérées précédement. Explications :
    ' -hDestDc Les infos recupérées doivent être envoyées
    'dans le contexte de périphérique de la PictureBox pour
    'la sauvegarder.
    ' - x,y mesures pour ajuster la Picture1 (pour
    'avoir un positionnement similaire sinon.
    ' -nWidth,nHeight Largeur et Hauteur de l'image pour
    'la recopier dans le Picture1 (tailles similaires)
    ' -hSrcDc C'est le contexte de périph de la source
    '(ici c'est celui du Bureau)
    ' -xSrc,ySrc Dimensions du rectangle (avec la fonction
    'GetWindowRect)
    Suc = BitBlt(hDestdc, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, dwRop&)

    'On sauvegarde
    SavePicture Picture1.Image, App.Path & "\methode2.bmp"
End Sub

Conclusion :


Encore une fois j'espère que ça aidera !

Si vous avez des questions, des problêmes, vous avez découvert un bug : commentez

http://www.kephren.fr.fm/

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_Clem
Messages postés
282
Date d'inscription
dimanche 1 avril 2001
Statut
Membre
Dernière intervention
12 février 2007
-
Merci, je cherchai comment capturer l'écran sans mettre la capture dans le presse papiers (Pour un trojan, bien évidamment ! Mais pour hacker l'ordi de mon père qui se trouve à quelques mettres de moi !)
C'est vrai qu'il y a beaucoup de commentaires, moi, c'est tout l'inverse : 0 rem !
Il faudrait que l'image soit compréssée en jpg avant d'être envoyée, sinon ça va être long.
cs_Kephren
Messages postés
54
Date d'inscription
dimanche 25 novembre 2001
Statut
Membre
Dernière intervention
19 mai 2003
-
C'est vrai que la compression Jpeg ne serait pas de trop ! Il faudrait que je bosse la dessus mais je ne vois pas la tout de suite une API qui pourrait servir à ça.
Si c'est toi qui à mis cette note :
1) je te remercie de l'avoir noté :p
2) Ravis que ça puisse t'aider !

Allez @+++
NeoFO
Messages postés
30
Date d'inscription
mardi 17 octobre 2000
Statut
Membre
Dernière intervention
18 juin 2002
-
pas mal, c vrai que c bien commenté.
Merci sa va être utile pour mon prog.
langju
Messages postés
88
Date d'inscription
mardi 6 février 2001
Statut
Membre
Dernière intervention
27 juillet 2007
-
Pour creer un jpeg, utilise la librarie de intel IJL151.dll
Elle te permettra de sauvegarder et de charger du jpeg.
Moi c'est ce que j'utilise pour l'instant pour mon programme de prise de controle à distance.
cs_Kephren
Messages postés
54
Date d'inscription
dimanche 25 novembre 2001
Statut
Membre
Dernière intervention
19 mai 2003
-
Je vous remercie tous !
langju je vais étudier ça, mais bon les dll je ne suis pas trop fan. Il faut que l'utilisateur sache que le programme fonctionne sans avoir installé 1000 dll et ocx :p
Mais si c'est le seul moyen...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.