Capture écran

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

Capture écran

#1

Message par marcgforce »

Edit #2

Je suis tombé il y a peu sur le forum anglais sur un script qui permet de lire les QR code avec une webcam, et je me suis amusé à rajouter cette fonction à l'exemple pour le fun...



Edit,

j'ai un peu retravaillé le script, j'y ai ajouté le détection 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
Global $QRcodeReader = False
FileInstall("---CHEMIN VERS LA DLL---\QRCodeDecodeDll.dll",".\")
HotKeySet("{PRINTSCREEN}","_capture")

Opt("TrayMenuMode",1)
Local $trayMenuLancer = TrayCreateItem("Voir la capture")
Local $trayQRcode = TraycreateItem("Lire QR Code")
TrayItemSetState($trayMenuLancer,4)
TrayItemSetState($trayQRcode,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

      Case $nsystray = $trayQRcode
         If $QRcodeReader = False Then
            TrayItemSetState($trayQRcode,1)
            $QRcodeReader = True
            _capture()
         Else
            $QRcodeReader = False
            TrayItemSetState($trayQRcode,4)
         EndIf

   EndSelect
   sleep(10)
WEnd

Func _capture()
   if $QRcodeReader == True Then
      Local $aRet = Mark_Rect()
      If IsArray($aRet) then
         Local $QRFile = @ScriptDir & "\Qrtempfile.bmp"
         $hBMP = _ScreenCapture_Capture($QRFile, $iX1, $iY1, $iX2, $iY2, False)
         Snapper($QRFile)
         FileDelete($QRFile)
         $QRcodeReader = False
         TrayItemSetState($trayQRcode,4)
      EndIf
   Else
      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
         if $input_name="" Then Return
         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 a été copié dans " & $sfilename_jpg_complete & " et placé dans le Presse Papier",2)
            if $visionner Then ShellExecute($sfilename_jpg_complete)
         EndIf
      Else
         Return $aRet
      EndIf
   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("", @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) < 10 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


Func Snapper($QR) ; fonction permettant de lire le QR code capturé et le décoder à l'aide de la DLL
      Local $hDll = DllOpen(@ScriptDir & '\QRCodeDecodeDll.dll')
    Local $Ret = DllCall($hDll, 'ptr', 'QRCodeDecodeImageFile', 'str', $QR, 'int*', 0)
   If $Ret[0] Then
        Local $data = BinaryToString(StringToBinary(_WinAPI_GetString(DllStructGetData(DllStructCreate('ptr', $Ret[0]), 1), 0), 1), 4)
        ClipPut($data)
      MsgBox(0,"QR Code",$data & " a été placé dans le Presse Papier",2)

        DllCall($hDll, 'none', 'QRCodeFree', 'ptr', $Ret[0], 'int', $Ret[2])
   Else
      Msgbox(0,"Erreur","Ce n'est pas un QR Code !",3)
    EndIf
    DllClose($hDll)
EndFunc   ;==>Snapper
Cordialement
Répondre