Capture écran

Partagez vos scripts, et vos applications AutoIt.
Règles du forum
.
Répondre
marcgforce
Niveau 3
Niveau 3
Messages : 41
Enregistré le : lun. 07 mars 2016 07:20
Status : Hors ligne

Capture écran

#1

Message par marcgforce »

Edit,

j'ai un peu retravaillé le script, j'y ai ajouté le detection des caractères interdits pour le nom de fichier, un menu dans le systray pour declencher un aperçu de la capture une fois faite, et l'envoi de la capture dans le buffer, ce qui permet de faire un copier coller direct si on veut.


Bonjour,

Un petit script de capture écran que j'ai fabriqué à partir du sujet suivant : Selecting a rectangle to ScreenCapture qui permet de definir une zone de capture.
Le script tourne en résident et capture la touche PRINTSCREEN, une fois appuyée, la GUI de sélection s'active et permet de définir une zone à capturer. La touche ESCAPE permet de sortir de la boucle.
Une fois faite, la capture est sauvée dans "mes documents" avec le nom définit dans l'inputbox.
Le script se termine (mais reste en résident) en affichant l'image dans le logiciel définit par défaut pour ouvrir les JPG
Tout nouvel appuie sur PRINTSCREEN déclenche le script.



C'est simple mais peut être amélioré.
Voilà le code :D
#include <Date.au3>
#include<array.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#Include <ScreenCapture.au3>
#Include <Misc.au3>
#include <EditConstants.au3>
#include <Clipboard.au3>

Global $pos, $sfilename_complete
Global $iX1, $iY1, $iX2, $iY2, $aPos, $sMsg, $sBMP_Path
Global Const $IMAGE = $sfilename_complete ; Location of the image file to print
Global $s_ProgramTitle01 = "Select Rectangle"
Global $visionner = False
HotKeySet("{PRINTSCREEN}","_capture")

Opt("TrayMenuMode",1)
Local $trayMenuLancer = TrayCreateItem("Voir la capture")
TrayItemSetState($trayMenuLancer,4)
Local $trayMenu = TrayCreateItem ("Quitter")

While 1
        $nsystray = TrayGetMsg()
        Select
                case $nsystray = $trayMenuLancer
                        If $visionner = False Then
                                TrayItemSetState($trayMenuLancer,1)
                                $visionner = True
                        Else
                                $visionner = False
                                TrayItemSetState($trayMenuLancer,4)
                        EndIf

                case $nsystray = $trayMenu
                        Exit
        EndSelect
        sleep(100)
WEnd

Func _capture()
        local $aRet = Mark_Rect()
        If IsArray($aRet) then
            Local $hGUI, $hBMP, $hBitmap, $hGraphic, $hImage, $iX, $iY, $hClone
                $input_name = Inputbox("Capture","Entrer le nom de la capture écran", "capture-" & StringReplace(_nowtime(),":",""))
                while  _CheckForbidden($input_name) <> 0
                        msgbox (64,"Erreur", "Erreur, le nom comporte des caractères interdits :"& @CRLF & '["/\\*?<>|:]')
                        $input_name = Inputbox("Capture","Entrer le nom de la capture écran", "capture-" & StringReplace(_nowtime(),":",""))
                wend
                local $sfilename = "capure de " & $input_name
                $sfilename_jpg_complete = @MyDocumentsDir & "\" & $sfilename & ".jpg"
                $sfilename_bmp_complete = @MyDocumentsDir & "\" & $sfilename & ".bmp"
                sleep (500)
               ; Capture un bitmap 32 bits
                $hBMP = _ScreenCapture_Capture(@MyDocumentsDir & "\" & $sfilename & ".bmp", $iX1, $iY1, $iX2, $iY2, False)
                $hJPG = _ScreenCapture_Capture(@MyDocumentsDir & "\" & $sfilename & ".jpg", $iX1, $iY1, $iX2, $iY2, False)
                $hClipboard_Bitmap = _WinAPI_LoadImage("",$sfilename_bmp_complete, $IMAGE_BITMAP, $iX2-$iX1,$iy2-$iy1,$LR_LOADFROMFILE)
                _ClipBoard_Open(0)
                _ClipBoard_Empty()
                _ClipBoard_SetDataEx($hClipboard_Bitmap,$CF_BITMAP)
                _ClipBoard_Close()
                FileDelete($sfilename_bmp_complete)
                if not $hClipboard_Bitmap then
                        Msgbox(64,"Erreur", "Image non capturée")
                Else
                        msgbox(0,"Capture","Le fichier à été copié dans " & $sfilename_jpg_complete & " et placé dans le clipboard",2)
                        if $visionner Then ShellExecute($sfilename_jpg_complete)
                EndIf
                ;ShellExecute($sfilename_complete)
        Else
                Return $aRet
        EndIf
 EndFunc   ;==> _capture


Func Mark_Rect()
    Local $aMouse_Pos, $hMask, $hMaster_Mask, $iTemp
    Local $UserDLL = DllOpen("user32.dll")
        Local $aRet[4]
    ; Create transparent GUI with Cross cursor
    $hCross_GUI = GUICreate("Test", @DesktopWidth , @DesktopHeight - 20, 0, 0, $WS_POPUP, $WS_EX_TOPMOST)
    WinSetTrans($hCross_GUI, "", 8)
    GUISetState(@SW_SHOW, $hCross_GUI)
    GUISetCursor(3, 1, $hCross_GUI)

    Global $hRectangle_GUI = GUICreate("", @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW + $WS_EX_TOPMOST)
    GUISetBkColor(0x000000)

    ; Wait until mouse button pressed
    While Not _IsPressed("01", $UserDLL)
        Sleep(10)
                if _IsPressed("1B", $UserDLL) then
                        GUIDelete( $hRectangle_GUI)
                        GUIDelete($hCross_GUI)
                        DllClose($UserDLL)
                        $aRet = "ESC"
                        return $aRet
                EndIf
    WEnd

    ; Get first mouse position
    $aMouse_Pos = MouseGetPos()
    $iX1 = $aMouse_Pos[0]
    $iY1 = $aMouse_Pos[1]

    ; Draw rectangle while mouse button pressed
    While _IsPressed("01", $UserDLL)

        $aMouse_Pos = MouseGetPos()

        $hMaster_Mask = _WinAPI_CreateRectRgn(0, 0, 0, 0)
        $hMask = _WinAPI_CreateRectRgn($iX1,  $aMouse_Pos[1], $aMouse_Pos[0],  $aMouse_Pos[1] + 1) ; Bottom of rectangle
        _WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
        _WinAPI_DeleteObject($hMask)
        $hMask = _WinAPI_CreateRectRgn($iX1, $iY1, $iX1 + 1, $aMouse_Pos[1]) ; Left of rectangle
        _WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
        _WinAPI_DeleteObject($hMask)
        $hMask = _WinAPI_CreateRectRgn($iX1 + 1, $iY1 + 1, $aMouse_Pos[0], $iY1) ; Top of rectangle
        _WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
        _WinAPI_DeleteObject($hMask)
        $hMask = _WinAPI_CreateRectRgn($aMouse_Pos[0], $iY1, $aMouse_Pos[0] + 1,  $aMouse_Pos[1]) ; Right of rectangle
        _WinAPI_CombineRgn($hMaster_Mask, $hMask, $hMaster_Mask, 2)
        _WinAPI_DeleteObject($hMask)
        ; Set overall region
        _WinAPI_SetWindowRgn($hRectangle_GUI, $hMaster_Mask)

        If WinGetState($hRectangle_GUI) < 15 Then GUISetState()
        Sleep(10)

    WEnd

    ; Get second mouse position
    $iX2 = $aMouse_Pos[0]
    $iY2 = $aMouse_Pos[1]

    ; Set in correct order if required
    If $iX2 < $iX1 Then
        $iTemp = $iX1
        $iX1 = $iX2
        $iX2 = $iTemp
    EndIf
    If $iY2 < $iY1 Then
        $iTemp = $iY1
        $iY1 = $iY2
        $iY2 = $iTemp
    EndIf

    GUIDelete( $hRectangle_GUI)
    GUIDelete($hCross_GUI)
    DllClose($UserDLL)
        $aRet[0] = $iX1
        $aRet[1] = $iY1
        $aRet[2] = $iX2
        $aRet[3] = $iY2

        if ($iX2-$iX1)+($iY2-$iY1) < 150 Then
                msgbox(0,"Erreur","Capture trop petite : "& ($iX2-$iX1)+($iY2-$iY1) & " Pixel(s), non enregistrée",2)
                $aRet = ""
                $aRet = "ESC"
        EndIf

        return $aRet


EndFunc   ;==>Mark_Rect

Func _CheckForbidden($string)
  Local $pattern_forbid = '["/\\*?<>|:]'
  Return  StringRegExp($string, $pattern_forbid)
EndFunc
Cordialement

Répondre