Aspiscreen - capturer l'écran - la form

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

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.