DeskCam - Capture d'écran

Programmation d'applications complexes
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

DeskCam - Capture d'écran

Message par JohnJohnsonSHERMAN »

Voilà, j'avais envie de faire un petit code qui fasse un peu comme l'outil capture de Windows avec un bruitage en plus... Ca m'a aussi permis de tester la lib LoadNet de Dobro :P
(ces dernier temps, je suis obnubilé par les fenêtres transparentes on dirait... ;) )
Vous pouvez redimensionner la fenêtre pour capturer une zone plus grande de l'écran. Pour l'instant il faut ajouter manuellement l'extension du fichier image quand on l'enregistre, et c'est seulement du png... Bon c'est un premier jet d'un truc que j'ais fait pour passer le temps, donc... :roll: :wink:

Et vous verrez y'a une petite anim' 8)

Code : Tout sélectionner

#GWL_EXSTYLE = -20
#GWL_STYLE = -16
#WS_EX_LAYERED = 524288
#LWA_ALPHA = 2
#LWA_COLORKEY = 1

Prototype.i Proto_SetWindowLong_(hWnd,nIndex.i, NewLong.l)
Prototype.b Proto_SetLayeredWindowAttributes_(hWnd,ColorKey,Alpha.b,Flags.w)


If OpenLibrary(1,"user32.dll")
  If GetFunction(1,"SetWindowLongW") 
    SetWindowLong_.Proto_SetWindowLong_ = GetFunction(1,"SetWindowLongW") ;on charge la fonction
  Else
    MessageRequester("Erreur","Fonction inexistante",16)
  EndIf
  SetLayeredWindowAttributes_.Proto_SetLayeredWindowAttributes_ = GetFunction(1,"SetLayeredWindowAttributes")
Else
  MessageRequester("Erreur","Erreur d'accés a user32.dll.",16)
EndIf

Enumeration
  #Capture
  #Img_captured
  #New
  #img_view
  #yes
  #no
EndEnumeration

UsePNGImageEncoder()
InitSound()

Global hCaptureBMP

Procedure.l LoadSound_net_cliclac();Un peu modifié, puisque DropBox ajoute un argument aprés le fichier, ici "?dl=1".
  ; By Dobro
  ;Adr$=adresse du fichier image a charger
  ;nom_fichier$ = nom qu'on donne a ce son
  ; la procedure renvoi l'Id du son recupéré ou False en cas d'erreur
  Protected sound,path$
  InitNetwork()
  path$=GetTemporaryDirectory()
  If ReceiveHTTPFile("https://www.dropbox.com/s/6l0vl6wl4eaou7e/ClicClacPhoto.wav?dl=1", path$+"tmp_ClicClacPhoto.wav");Pour télécharger depuis DropBox, collez le lien de votre fichier et changez dl=0 en dl=1
    sound=LoadSound(#PB_Any, path$+"tmp_ClicClacPhoto.wav")
    ;DeleteFile(path$+"tmp_ClicClacPhoto.wav")
    ProcedureReturn sound
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure CaptureScreenPart(Left.l,Top.l,width.l,height.l) ; CaptureScreenPart : Returns pointer to BMP SnapShot
  
  dm.DEVMODE 
  BMPHandle.l 
  srcDC = CreateDC_("DISPLAY", "", "", dm) 
  trgDC = CreateCompatibleDC_(srcDC) 
  BMPHandle = CreateCompatibleBitmap_(srcDC, width, height) 
  SelectObject_( trgDC, BMPHandle) 
  BitBlt_( trgDC, 0, 0, width, height, srcDC, Left, Top, #SRCCOPY) 
  DeleteDC_( trgDC) 
  ReleaseDC_( BMPHandle, srcDC)
  
  CaptureScreenHeight=height
  CaptureScreenWidth=width
  CaptureScreenBMPHandle=BMPHandle
  ProcedureReturn BMPHandle 
EndProcedure 

Procedure SaveCapture(File.s, ImagePlugin , JpegCompression) ; Saves previous capture to file
  
  If CaptureScreenBMPHandle
    Id=CreateImage(#PB_Any, CaptureScreenWidth, CaptureScreenHeight) 
    StartDrawing(ImageOutput(Id)) 
      DrawImage(CaptureScreenBMPHandle,0,0) 
    StopDrawing()
    
    Select ImagePlugin
        
      Case #PB_ImagePlugin_JPEG 
        UseJPEGImageEncoder()
        retour=SaveImage(Id, File,#PB_ImagePlugin_JPEG,JpegCompression)
        
      Case #PB_ImagePlugin_PNG
        UsePNGImageEncoder()
        retour=SaveImage(Id, File,#PB_ImagePlugin_PNG)
        
      Default
        retour=SaveImage(Id, File)
        
    EndSelect
    
    FreeImage(Id)
    
  EndIf
  
  ProcedureReturn retour
EndProcedure

Procedure SaveImageRequest()
  ImgWidth = WindowWidth(1)
  ImgHeight = WindowHeight(1)
  
  OpenWindow(2,0,0,ImgWidth+20,ImgHeight+45,"Sauvegarder cette capture ?",#PB_Window_ScreenCentered | #PB_Window_Tool)
  CanvasGadget(#img_view,10,10,ImgWidth,ImgHeight,#PB_Canvas_Border)
  ButtonGadget(#yes,ImgWidth/2-55,ImgHeight + 10,50,20,"Oui")
  ButtonGadget(#no,ImgWidth/2+5,ImgHeight + 10,50,20,"Non")
  StartDrawing(CanvasOutput(#img_view)) 
  DrawImage(hCaptureBMP,0,0) 
  StopDrawing()
  
  Repeat
    event2=WaitWindowEvent()
    Select event2
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #yes
            CloseWindow(2)
            ProcedureReturn 1
          Case #no
            CloseWindow(2)
            ProcedureReturn 0
        EndSelect
    EndSelect
  ForEver
EndProcedure


OpenWindow(1,0,0,600,400,"DeskCam",#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget)
Clic = LoadSound(#PB_Any,GetTemporaryDirectory()+"tmp_ClicClacPhoto.wav")
If Not Clic
  Clic = LoadSound_net_cliclac()
EndIf

SetWindowColor(1,RGB(255,0,0))
SetWindowLong_(WindowID(1),#GWL_EXSTYLE,#WS_EX_LAYERED)
SetLayeredWindowAttributes_(WindowID(1),RGB(255,0,0),1,#LWA_COLORKEY)
ButtonGadget(1,10,10,80,25,"Capture")

Repeat
  event=WaitWindowEvent()
  Select event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1
          HideGadget(1,1)
          hCaptureBMP=CaptureScreenPart(WindowX(1,#PB_Window_InnerCoordinate),WindowY(1,#PB_Window_InnerCoordinate),WindowWidth(1),WindowHeight(1))
          If Clic <> 0
            PlaySound(Clic)
          EndIf
          
          For i = WindowWidth(1) To 10 Step -10
            StartDrawing(WindowOutput(1))
            Box(0,0,OutputWidth(),OutputHeight(),$000000)
            Circle(OutputWidth()/2,OutputHeight()/2,i,$0000FF)
            StopDrawing()
            Delay(6)
          Next
          For i = 10 To WindowWidth(1) Step 10
            StartDrawing(WindowOutput(1))
            Box(0,0,OutputWidth(),OutputHeight(),$000000)
            Circle(OutputWidth()/2,OutputHeight()/2,i,$0000FF)
            StopDrawing()
            Delay(20)
          Next
          StartDrawing(WindowOutput(1))
          Box(0,0,OutputWidth(),OutputHeight(),$0000FF)
          StopDrawing()
          HideGadget(1,0)
          If SaveImageRequest() = #True
            file$=SaveFileRequester("Enregistrer l'image","Capture.png","Image PNG (.png)|*.png|Image compressée JEPG (.jpg , .jepg)|*.jepg;*.jpg|Image bitmap (.bmp)|*.bmp",0)
            SaveCapture(file$,#PB_ImagePlugin_PNG,0)
          EndIf
          
      EndSelect
  EndSelect
  
Until event = #PB_Event_CloseWindow
Edit : CaptureScreenPart() et SaveCapture() sont de la Droopy lib et LoadSound_net_cliclac() est de Dobro (un tout petit peu adaptée)
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé