Copie d'écran

Vous avez développé un logiciel en PureBasic et vous souhaitez le faire connaitre ?
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Copie d'écran

Message par Le Soldat Inconnu »

Salut tout le monde,

un petit logiciel pour faire des copies d'écran

Image

vous pouvez le télécharger ici
http://www.lsi-dev.com/index.php?mod=ar ... ires&id=86

et vous trouverez le code plus bas :)

Une petite description s'impose
Tout d'abord, il faut lancer le logiciel :mrgreen:

Vous configurez le format d'enregistrement :
- BMP
- PNG
- JPG (avec réglage de la qualité)

Vous choisissez ensuite ce que vous souhaitez capturer :
- Tout l'écran
- L'écran sans la barre des tâches
- La fenêtre sous la souris
- Uniquement le contenu de la fenêtre sous la souris (donc sans la barre de titre et les bordures)
- Uniquement l'objet sous la souris (Par exemple, si la souris est au dessus d'un bouton, vous ne capturer que le bouton)

Et c'est finis ! Vous pouvez réduire la fenêtre, elle va se cacher à coté de l'horloge.

Ensuite, quand vous appuyez sur la touche "Imprime écran", vous verrez la zone capturer s'afficher avec un quadrillage noir et blanc.
La capture vous convient, vous faites un clic gauche sur l'aperçu pour l'enregistrer. Elle ne vous convient pas, un clic droit et elle est annulée.

Les images s'enregistre dans le même dossier que le programme.

Et quand vous avez finis, vous quittez le programme.
Le code
(normalement, il doit pas y avoir de fonction de mes UserLibs)

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4.41
; 
; Explication du programme :
; Faire une copie d'écran

UsePNGImageEncoder()
UseJPEGImageEncoder()
; UsePNGImageDecoder()
; UseJPEGImageDecoder()

Global Format, Qualite, Type

Procedure CopieEcran(Format, Qualite, Type)
  Protected Ecran.RECT, Nb, Image, Image2, WinMouse, Fenetre.RECT, FenetreHG.POINT
	
	Ecran_Largeur = GetSystemMetrics_(#SM_CXSCREEN)
	Ecran_Hauteur = GetSystemMetrics_(#SM_CYSCREEN)
	DC = GetDC_(0)
	Image2 = CreateImage(#PB_Any, Ecran_Largeur, Ecran_Hauteur)
	Dessin = StartDrawing(ImageOutput(Image2))
		BitBlt_(Dessin, 0, 0, Ecran_Largeur, Ecran_Hauteur, DC, 0, 0, #SRCPAINT | $40000000)
	StopDrawing()
	ReleaseDC_(0, DC)
  
  ; On découpe l'image suivant le Type
  Select Type
		Case 0
      ; Tout l'écran
			Fenetre\left = 0
      Fenetre\right = Ecran_Largeur
      Fenetre\top = 0
      Fenetre\bottom = Ecran_Hauteur
		Case 1
      ; L'écran sans la barre des taches
      SystemParametersInfo_(#SPI_GETWORKAREA, 0, @Fenetre.RECT, 0)
		Case 2
      ; La fenêtre sous la souris
      WinMouse = WindowFromPoint_(DesktopMouseX() | DesktopMouseY() << 32)
			Repeat
				WinParent = GetParent_(WinMouse)
				If WinParent
					WinMouse = WinParent	
				EndIf
			Until WinParent = 0
      GetWindowRect_(WinMouse, Fenetre.RECT)
		Case 3
      ; Uniquement le contenu de la fenêtre sous la souris
      WinMouse = WindowFromPoint_(DesktopMouseX() | DesktopMouseY() << 32)
			Repeat
				WinParent = GetParent_(WinMouse)
				If WinParent
					WinMouse = WinParent	
				EndIf
			Until WinParent = 0
			GetClientRect_(WinMouse, Fenetre.RECT) : ClientToScreen_(WinMouse, FenetreHG.POINT)
      Fenetre\left + FenetreHG\X
      Fenetre\right + FenetreHG\X
      Fenetre\top + FenetreHG\Y
      Fenetre\bottom + FenetreHG\Y
		Case 4
			; Uniquement l'objet sous la souris
      WinMouse = WindowFromPoint_(DesktopMouseX() | DesktopMouseY() << 32)
			; WinAncestor = GetAncestor_(WinMouse, #GA_PARENT)
			; If WinAncestor
			; WinMouse = WinAncestor
			; EndIf
      GetClientRect_(WinMouse, Fenetre.RECT) : ClientToScreen_(WinMouse, FenetreHG.POINT)
      Fenetre\left + FenetreHG\X
      Fenetre\right + FenetreHG\X
      Fenetre\top + FenetreHG\Y
      Fenetre\bottom + FenetreHG\Y
	EndSelect
  
	If Fenetre\left < 0 : Fenetre\left = 0 : EndIf
	If Fenetre\top < 0 : Fenetre\top = 0 : EndIf
	If Fenetre\right > ImageWidth(Image2) : Fenetre\right = ImageWidth(Image2) : EndIf
	If Fenetre\bottom > ImageHeight(Image2) : Fenetre\bottom = ImageHeight(Image2) : EndIf
	Image = GrabImage(Image2, #PB_Any, Fenetre\left, Fenetre\top, Fenetre\right - Fenetre\left, Fenetre\bottom - Fenetre\top)
	
	FreeImage(Image2)
	If IsImage(Image)
		Visualiser = OpenWindow(#PB_Any, Fenetre\left, Fenetre\top, Fenetre\right - Fenetre\left, Fenetre\bottom - Fenetre\top, "Visualisation", #PB_Window_BorderLess)
		If Visualiser
			StickyWindow(Visualiser, 1)
			
			Image2 = CopyImage(Image, #PB_Any)
			StartDrawing(ImageOutput(Image2))
				DrawingMode(#PB_2DDrawing_AlphaBlend)
				For X = 0 To Fenetre\right - Fenetre\left - 1 Step 8
					For Y = 0 To Fenetre\bottom - Fenetre\top - 1 Step 8
						If ((X + Y) / 8) & %1 = 1
							Box(X, Y, 8, 8, $40FFFFFF)
						Else
							Box(X, Y, 8, 8, $40000000)
						EndIf
					Next
				Next
			StopDrawing()
			
			Gadget = ImageGadget(#PB_Any, 1, 1, 0, 0, ImageID(Image2))
			GadgetToolTip(Gadget, "Clic gauche = Sauver  /  Clic droit = Annuler")
			
			Repeat
				Event = WaitWindowEvent()
				
				If Event = #PB_Event_Gadget
					If EventGadget() = Gadget
						Select EventType()
							Case #PB_EventType_LeftClick
								Enregistrer = 1
							Case #PB_EventType_RightClick
								Enregistrer = -1
						EndSelect
					EndIf
				EndIf
				
			Until Enregistrer <> 0
			
			CloseWindow(Visualiser)
			
			FreeImage(Image2)
		EndIf
	
		
		; On enregistre l'image
		If Enregistrer > 0
			Nb = 0
			Repeat 
				Nb + 1
			Until FileSize("Copie d'écran " + RSet(Str(Nb), 4, "0") + ".bmp") = -1 And FileSize("Copie d'écran " + RSet(Str(Nb), 4, "0") + ".png") = -1 And FileSize("Copie d'écran " + RSet(Str(Nb), 4, "0") + ".jpg") = -1
			
			Select Format
				Case 0
					Nom.s = "Copie d'écran " + RSet(Str(Nb), 4, "0") + ".bmp"
					SaveImage(Image, Nom, #PB_ImagePlugin_BMP)
				Case 1
					Nom.s = "Copie d'écran " + RSet(Str(Nb), 4, "0") + ".png"
					SaveImage(Image, Nom, #PB_ImagePlugin_PNG)
				Case 2
					Nom.s = "Copie d'écran " + RSet(Str(Nb), 4, "0") + ".jpg"
					SaveImage(Image, Nom, #PB_ImagePlugin_JPEG, Qualite)
			EndSelect
			SetGadgetText(5, Nom)
			
			MessageBeep_(#MB_OK)
		EndIf
		
		FreeImage(Image)
	EndIf

EndProcedure


Global KeyboardHook
Procedure LowLevelKeyboardProc(nCode.l, wParam.l, lParam.l)
	If nCode=#HC_ACTION
		Select wParam 
			Case #WM_KEYDOWN
			Case #WM_KEYUP
				vkCode = PeekL(lParam)
				If vkCode = 44
					CopieEcran(Format, Qualite, Type)
				EndIf
		EndSelect
	EndIf
	ProcedureReturn CallNextHookEx_(KeyboardHook, nCode, wParam, lParam)
EndProcedure
Procedure AddKeyboardHook()
	If KeyboardHook = 0
		KeyboardHook = SetWindowsHookEx_(#WH_KEYBOARD_LL, @LowLevelKeyboardProc(), GetModuleHandle_(0), 0)
	EndIf
	ProcedureReturn KeyboardHook
EndProcedure
Procedure RemoveKeyboardHook()
	If KeyboardHook
		UnhookWindowsHookEx_(KeyboardHook)
		KeyboardHook = 0
	EndIf
EndProcedure

; Format
; 0 = BMP
; 1 = PNG
; 2 = JPG



Procedure AffichageQualite(Format)
  If Format = 2
    HideGadget(2, 0)
    HideGadget(3, 0)
  Else
    HideGadget(2, 1)
    HideGadget(3, 1)
  EndIf
EndProcedure





; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 196, "Copie d'écran", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
  End
EndIf

StickyWindow(0, 1)

LoadFont(0, "Tahoma", 8)
SetGadgetFont(#PB_Default, FontID(0))
LoadFont(1, "Tahoma", 8, #PB_Font_Bold)

TextGadget(0, 0, 0, 150, 16, " Format de l'image :") : SetGadgetFont(0, FontID(1))
ComboBoxGadget(1, 0, 16, 150, 24)
AddGadgetItem(1, 0, "Bmp")
AddGadgetItem(1, 1, "Png")
AddGadgetItem(1, 2, "Jpg")
TextGadget(2, 150, 0, 150, 16, " Qualité de l'image :") : SetGadgetFont(2, FontID(1))
ComboBoxGadget(3, 150, 16, 150, 24)
For n = 1 To 10
  AddGadgetItem(3, n - 1, Str(n))
Next

OpenPreferences("Copie d'écran.ini")
Format = ReadPreferenceLong("Format", 1)
Qualite = ReadPreferenceLong("Qualité", 10)
Type = ReadPreferenceLong("Type", 0)
ClosePreferences()

SetGadgetState(1, Format)
SetGadgetState(3, Qualite - 1)

AffichageQualite(Format)

TextGadget(7, 0, 50, 300, 16, " Type de copie d'écran :") : SetGadgetFont(7, FontID(1))
OptionGadget(10, 0, 66, 300, 16, "Tout l'écran")
OptionGadget(11, 0, 82, 300, 16, "L'écran sans la barre des taches")
OptionGadget(12, 0, 98, 300, 16, "La fenêtre sous la souris")
OptionGadget(13, 0, 114, 300, 16, "Uniquement le contenu de la fenêtre sous la souris")
OptionGadget(14, 0, 130, 300, 16, "Uniquement l'objet sous la souris")
SetGadgetState(10 + Type, 1)

TextGadget(4, 0, 156, 50, 16, " Image :") : SetGadgetFont(4, FontID(1))
TextGadget(5, 50, 156, 250, 16, "")

ButtonGadget(6, 0, 172, 276, 24, "Ouvrir le dossier contenant les copies d'écran")
ButtonGadget(8, 275, 172, 24, 24, "?")

Icone = CreateImage(#PB_Any, 16, 16, 32)
StartDrawing(ImageOutput(Icone))
	DrawingMode(#PB_2DDrawing_AlphaChannel)
	Box(0, 0, 16, 16, 0)
	DrawingMode(#PB_2DDrawing_AlphaBlend)
	Box(1, 1, 14, 14, RGBA(150, 200, 255, 100))
	Box(0, 0, 2, 2, $FF000000)
	Box(14, 0, 2, 2, $FF000000)
	Box(0, 14, 2, 2, $FF000000)
	Box(14, 14, 2, 2, $FF000000)
	DrawingMode(#PB_2DDrawing_AlphaBlend | #PB_2DDrawing_Outlined)
	Box(1, 1, 14, 14, $60000000)
StopDrawing()

If AddSysTrayIcon(0, WindowID(0), ImageID(Icone))
  SysTrayIconToolTip(0, "Copie d'écran")
Else
  End
EndIf

AddKeyboardHook()

Repeat
  Event = WaitWindowEvent(200)
  Select Event
    Case #PB_Event_Gadget
      Select EventGadget() ; Gadgets
        Case 1
          Format = GetGadgetState(1)
          AffichageQualite(Format)
        Case 3
          Qualite = GetGadgetState(3) + 1
        Case 6
          RunProgram("Explorer.exe", GetPathPart(ProgramFilename()), "")
        Case 10
          If GetGadgetState(10) = 1
            Type = 0
          EndIf
        Case 11
          If GetGadgetState(11) = 1
            Type = 1
          EndIf
        Case 12
          If GetGadgetState(12) = 1
            Type = 2
          EndIf
        Case 13
          If GetGadgetState(13) = 1
            Type = 3
					EndIf
				Case 14
          If GetGadgetState(14) = 1
            Type = 4
					EndIf
        Case 8
          MessageRequester("Copie d'écran", "Auteur : BOUGUIN Régis (LSI Développements)" + Chr(10) + "Logiciel de programmation : PureBasic v4")
      EndSelect
    Case #PB_Event_SysTray
      Select EventType()
        Case #PB_EventType_LeftClick, #PB_EventType_RightClick
					Masquer = 1 - Masquer
          If Masquer
            HideWindow(0, 1)
          Else
 						; ShowWindow_(WindowID(0), #SW_NORMAL)
						SetWindowState(0, #PB_Window_Normal)
            HideWindow(0, 0)
          EndIf
      EndSelect
  EndSelect
	
  If IsIconic_(WindowID(0)) And Masquer = 0
    HideWindow(0, 1)
		Masquer = 1
  EndIf
  
Until Event = #PB_Event_CloseWindow

If CreatePreferences("Copie d'écran.ini")
  WritePreferenceLong("Format", Format)
  WritePreferenceLong("Qualité", Qualite)
  WritePreferenceLong("Type", Type)
  ClosePreferences()
EndIf

End
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Copie d'écran

Message par flaith »

:D Merci pour le code LSI :mrgreen:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Copie d'écran

Message par Kwai chang caine »

Oui merci beaucoup soldat pour le partage du code, c'est drolement généreux de ta part 8)

Y marche drolement bien ton programme, j'ai pas tout essayé, mais trop cool :D
Juste un tout petit truc, quand je clique sur "ouvrir le dossier contenant....", ça m'ouvre le "C:\Temp" alors que les photos elles sont dans le "c:\" 8O

Voila encore merci 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Copie d'écran

Message par Backup »

moi j'utilise celui de Nico ....

qui franchement est top de chez top .... :)

il peut soit prendre la totalité de l'ecran , soit une fenetre précise , soit grace a une fenetre de selection !! :)
Répondre