Page 1 sur 1

Récupérer l'image du curseur de la souris [Résolu]

Publié : sam. 15/sept./2012 10:34
par Stefou
Bonjour à tous,

Je fais des copies d'écran, mais le curseur de la souris n'est pas visible.

J'aimerais pourtant capturer l'image du curseur de la souris.

Est-ce que quelqu'un aurait un chti bout de code pour récupérer l'image du curseur.


Merci d'avance

Stef

Re: Récupérer l'image du curseur de la souris

Publié : sam. 15/sept./2012 11:52
par Ar-S
Voilà un code de LSI qui permet de changer le curseur, je me dis qu'il y a surement de quoi le récupérer du coup.

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4.50
;
; Explication du programme :
; Changer le curseur de la souris au dessus d'un gadget

Procedure SetGadgetCursor_SubClassProc(hwnd, msg, wparam, lparam) 
  Protected oldproc, Cursor
  oldproc = GetProp_(hwnd, "oldproc") 
  
  Select msg 
    Case #WM_NCDESTROY 
      RemoveProp_(hwnd, "oldproc") 
      RemoveProp_(hwnd, "cursor") 
      
    Case #WM_SETCURSOR
      Cursor = GetProp_(hwnd, "cursor") 
      SetCursor_(Cursor)
      ProcedureReturn 0 
      
  EndSelect    
  ProcedureReturn CallWindowProc_(oldproc, hwnd, msg, wparam, lParam) 
EndProcedure 
Procedure SetGadgetCursor(Gadget, Cursor) ; Change le curseur de la souris au dessus d'un Gadget
  If GetProp_(GadgetID(Gadget), "cursor")
    RemoveProp_(GadgetID(Gadget), "cursor") 
  EndIf
  SetProp_(GadgetID(Gadget), "cursor", Cursor)
  If GetProp_(GadgetID(Gadget), "oldproc") = 0
    SetProp_(GadgetID(Gadget), "oldproc", SetWindowLongPtr_(GadgetID(Gadget), #GWL_WNDPROC, @SetGadgetCursor_SubClassProc())) 
  EndIf
  SendMessage_(GadgetID(Gadget), #WM_SETCURSOR , 0, 0)
EndProcedure




Enumeration
  #Bouton
EndEnumeration
; Valeurs possibles pour le curseur :
#IDC_ARROW = 32512 ; la flèche (le curseur normal)
#IDC_IBEAM = 32513 ; curseur sélection de texte
#IDC_UPARROW = 32516 ; flèche qui pointe vers le haut
#IDC_APPSTARTING = 32650 ; curseur attente (flèche + sablier)
#IDC_WAIT = 32514 ; curseur occupé (sablier)
#IDC_CROSS = 32515 ; curseur précision de la sélection (croix)
#IDC_SIZENWSE = 32642 ; curseur de dimensionnment, pointe le NordOuest et le SudEst
#IDC_SIZENESW = 32643 ; curseur de dimensionnment, pointe le NE et le SO
#IDC_SIZEWE = 32644 ; curseur de dimensionnment, pointe le E et le O
#IDC_SIZENS = 32645 ; curseur de dimensionnment, pointe le N et le S
#IDC_SIZEALL = 32646 ; curseur de déplacement, pointe le N, S, E et O
#IDC_HELP = 32651 ; curseur aide
#IDC_HAND = 32649 ; curseur main
#IDC_NO = 32648 ; curseur "interdit" (panneau d'interdiction)

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

ButtonGadget(#Bouton, 20, 20, 128, 128, "Nouveau curseur")

Curseur = LoadCursor_(0, #IDC_HAND) ; Charge le curseur
SetGadgetCursor(#Bouton, Curseur) ; Applique le curseur au gadget

Repeat
	event = WaitWindowEvent()
	
	Select event
    Case #PB_Event_Menu
			Select EventMenu() ; Menus
					
      EndSelect
			
    Case #PB_Event_Gadget
			Select EventGadget() ; Gadgets
        Case #Bouton
          DestroyCursor_(Curseur) ; Supprime l'ancien curseur
          Curseur = LoadCursor_(0, #IDC_HELP) ; Charge le curseur
          SetGadgetCursor(#Bouton, Curseur) ; Applique le curseur au gadget
      EndSelect
  EndSelect
	
Until event = #PB_Event_CloseWindow

DestroyCursor_(Curseur) ; Supprime le curseur

Re: Récupérer l'image du curseur de la souris

Publié : sam. 15/sept./2012 12:22
par Stefou
C'est gentil....mais ça ne fait pas vraiment avancer le chmilblick !

Re: Récupérer l'image du curseur de la souris

Publié : sam. 15/sept./2012 13:12
par Ar-S
Un peu HS (désolé) mais peut être pas tant que ça.
A ce que j'ai pu lire, l'API BitBlt_ que tu dois (je suppose) utiliser dans ton screenshot ne capture pas le curseur.
La solution récurente que j'ai lu est que les gens capturent l'image puis le curseur et superposent les 2.
un code non PB qui devrait être adaptable sans trop galérer.

http://www.codeproject.com/Articles/128 ... use-Cursor

Re: Récupérer l'image du curseur de la souris

Publié : sam. 15/sept./2012 13:39
par Stefou
Effectivement cela m'aide davantage, reste à voir ci j'y comprends quelque chose....

Merci

Si quelqu'un à quelque chose de plus pure....basic, c'est pas de refus.

Re: Récupérer l'image du curseur de la souris

Publié : sam. 15/sept./2012 14:58
par Stefou
Je suis trop impressionné par moi même et les infos sur les forums!!!

Je m'en suis sortie !

Ce code ne marchera surement partout, mais il marche chez moi. Par exemple j'ai mis la taille du curseur à 32*32, c'est pas le cas chez tous le monde....

Code : Tout sélectionner

Procedure DessineCurseurSouris(StartDrawingDC,x,y)
  
  
  curst.CURSORINFO
  curst\Flags = CURSOR_SHOWING
  curst\cbSize = SizeOf(CURSORINFO)
  res=GetCursorInfo_(curst)
  
  
  DrawIconEx_(StartDrawingDC, x, y, curst\hCursor, 32, 32, 0, 0, #DI_NORMAL)
  
EndProcedure

OpenWindow(0,40,40,100,100,"Le curseur",  #PB_Window_SystemMenu )
StickyWindow(0,1)
ImageGadget(0,0,0,10,10,0)

AddWindowTimer(0,1,200)

Repeat
  event=WaitWindowEvent()
  Select event
    Case #PB_Event_Timer
      
      If CreateImage(1,100,100)
        
        
        StartDrawingID =StartDrawing(ImageOutput(1))
          Box(3,3,94,94,$9CEBA8)
          
          DessineCurseurSouris(StartDrawingID,5,5)
          
          
        StopDrawing()
        SetGadgetState(0,ImageID(1))
      EndIf
      
  EndSelect
  
Until event=#WM_CLOSE

Re: Récupérer l'image du curseur de la souris [Résolu]

Publié : sam. 15/sept./2012 17:02
par Ar-S
Bien joué, ;)
pour info il marche chez moi aussi

Re: Récupérer l'image du curseur de la souris [Résolu]

Publié : sam. 15/sept./2012 17:48
par Backup
une petite variante ( que j'avais en stock ) (Merci Nico )

Code : Tout sélectionner

#CAPTUREBLT = $40000000
Procedure CaptureScreen(hdc,x,y,w,h,blayered=0)
	Protected thdc,img 
	
	img = CreateImage(-1,w,h)
	thdc = StartDrawing(ImageOutput(img))
	
	If blayered   
		rt = BitBlt_(thdc,0,0,w,h,hdc,0,0,#SRCCOPY | #CAPTUREBLT);
		Else
		rt = BitBlt_(thdc,0,0,w,h,hdc,0,0,#SRCCOPY);
	EndIf
	
StopDrawing()


ProcedureReturn img

EndProcedure

UseJPEGImageEncoder()
UsePNGImageDecoder()

ExamineDesktops()
w= DesktopWidth(0)
h=DesktopHeight(0)
; ************************ ici on recupe le curseur *****************************
GetCursorPos_(point.POINT)
pci.CURSORINFO\cbSize=SizeOf(CURSORINFO)
GetCursorInfo_(@pci)
hIcon=CopyIcon_(pci\hCursor)
GetIconInfo_(hIcon, @info.ICONINFO)
hdc = GetDC_(0)
If hIcon
DrawIcon_(hdc ,point\x-left-info\xHotspot,point\Y-top-info\yHotspot, hIcon) ; on dessine le curseur dans le Context (hdc) courant
EndIf       
; **************************************************************************

img = CaptureScreen(hdc,0,0,w,h)

SaveImage(img,"c:\test.bmp",#PB_ImagePlugin_BMP) ; ecrit les shoot dans un dossier Test sur c:\
;SaveImage(img,"c:\test.png",#PB_ImagePlugin_PNG) ; dans 3 formats
;SaveImage(img,"c:\test.jpg",#PB_ImagePlugin_JPEG)

RunProgram("c:\test.bmp") ; on ouvre l'image bmp .. elle contient le curseur souris 

; 





; EPB

Re: Récupérer l'image du curseur de la souris [Résolu]

Publié : sam. 15/sept./2012 17:49
par falsam
En modifiant son code on peut obtenir une capture en temps reel du desktop.

Code : Tout sélectionner

Global Handle_Image.l

Procedure Capture(Handle_Image.l, Handle_DC, ScreenWidth, ScreenHeight)
  Protected curst.CURSORINFO
  #CAPTUREBLT = $40000000
  
  Result = StartDrawing(ImageOutput(Handle_Image))
    
  ;Capture de l'ecran
  BitBlt_(Result, 0, 0, ScreenWidth, ScreenHeight, handle_DC, 0, 0, #SRCCOPY|#CAPTUREBLT) 
  
  ;GetCursor_() : API qui récupère non pas l'image du curseur actif, mais son handle.
  curst\hCursor = GetCursor_() ;Cette ligne là peut etre commenter
  curst\cbSize = SizeOf(curst)
  
  GetCursorInfo_(curst)
  
  cx = (curst\ptScreenPos\x)  
  cy = (curst\ptScreenPos\y)  
    
  DrawIconEx_(Result, cx, cy, curst\hCursor, 0,0,0,0, #DI_DEFAULTSIZE|#DI_NORMAL)       

  StopDrawing()
EndProcedure

OpenWindow(0,0,0,720,450,"Capture ecran",#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)

ExamineDesktops()

Handle_Image = CreateImage(#PB_Any, DesktopWidth(0), DesktopHeight(0))
ImageGadget(0, 0, 0, WindowWidth(0), WindowHeight(0), ImageID(Handle_Image))

AddWindowTimer(0, 1, 50)

Repeat
  event=WaitWindowEvent()
   
  Select event
    Case #PB_Event_Timer
      Capture(Handle_Image, GetDC_(GetDesktopWindow_()), DesktopWidth(0), DesktopHeight(0))          
      SetGadgetState(0,ImageID(Handle_Image))
  EndSelect
Until event=#WM_CLOSE
Il suffit de rajouter un raccourci clavier pour récupérer l'image avec la souris.

Dobro tu m'a grillé d'une minute mais je laisse le code car sa fonctionnalité est différent de ton code :)

Re: Récupérer l'image du curseur de la souris [Résolu]

Publié : sam. 15/sept./2012 18:52
par SPH
falsam a écrit :En modifiant son code on peut obtenir une capture en temps reel du desktop.

Code : Tout sélectionner

Global Handle_Image.l

Procedure Capture(Handle_Image.l, Handle_DC, ScreenWidth, ScreenHeight)
  Protected curst.CURSORINFO
  #CAPTUREBLT = $40000000
  
  Result = StartDrawing(ImageOutput(Handle_Image))
    
  ;Capture de l'ecran
  BitBlt_(Result, 0, 0, ScreenWidth, ScreenHeight, handle_DC, 0, 0, #SRCCOPY|#CAPTUREBLT) 
  
  ;GetCursor_() : API qui récupère non pas l'image du curseur actif, mais son handle.
  curst\hCursor = GetCursor_() ;Cette ligne là peut etre commenter
  curst\cbSize = SizeOf(curst)
  
  GetCursorInfo_(curst)
  
  cx = (curst\ptScreenPos\x)  
  cy = (curst\ptScreenPos\y)  
    
  DrawIconEx_(Result, cx, cy, curst\hCursor, 0,0,0,0, #DI_DEFAULTSIZE|#DI_NORMAL)       

  StopDrawing()
EndProcedure

OpenWindow(0,0,0,720,450,"Capture ecran",#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)

ExamineDesktops()

Handle_Image = CreateImage(#PB_Any, DesktopWidth(0), DesktopHeight(0))
ImageGadget(0, 0, 0, WindowWidth(0), WindowHeight(0), ImageID(Handle_Image))

AddWindowTimer(0, 1, 50)

Repeat
  event=WaitWindowEvent()
   
  Select event
    Case #PB_Event_Timer
      Capture(Handle_Image, GetDC_(GetDesktopWindow_()), DesktopWidth(0), DesktopHeight(0))          
      SetGadgetState(0,ImageID(Handle_Image))
  EndSelect
Until event=#WM_CLOSE
Il suffit de rajouter un raccourci clavier pour récupérer l'image avec la souris.

Dobro tu m'a grillé d'une minute mais je laisse le code car sa fonctionnalité est différent de ton code :)
J'adoooore :idea:

Re: Récupérer l'image du curseur de la souris [Résolu]

Publié : sam. 15/sept./2012 19:51
par Backup
falsam a écrit :Dobro tu m'a grillé d'une minute mais je laisse le code car sa fonctionnalité est différent de ton code :)
t'as plutôt intérêt ! :) manquerai plus que ça , que tu retire tes codes :)