ImprimEcran impossible quand fenetre en background

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Shinao
Messages : 137
Inscription : dim. 21/sept./2008 13:00

ImprimEcran impossible quand fenetre en background

Message par Shinao »

Bonjour,bonsoir,

Voilà , j'ai fais un petit utilitaire pour lors de l'appui de la combinaisons CTRL+A, l'ordinateur prend un screenshot de l'écran...
Ce code fonctionne, hors je veux qu'il puisse le faire même si la fenêtre dans lequel j'ai utilisé le keyboardshorcut est en background...

De la même méthode que fraps, une combinaison pour screenshot...

Code source :

Code : Tout sélectionner

;@author Progi1984
Procedure Desktop_MakeScreenshot(Filename.s)
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Linux ;{
      Protected lProgram.l
      RunProgram("import", "-silent -window root "+GetFilePart(Filename), GetPathPart(Filename))
    ;}
    CompilerCase #PB_OS_Windows ;{
      Protected lImage.l
      Protected hDC.l
      lImage = CreateImage(#PB_Any, GetSystemMetrics_(#SM_CXSCREEN),GetSystemMetrics_(#SM_CYSCREEN))
      hDC = StartDrawing(ImageOutput(lImage))
        BitBlt_(hDC,0,0,ImageWidth(lImage),ImageHeight(lImage),GetDC_(GetDesktopWindow_()), 0, 0, #SRCCOPY)
      StopDrawing()
      ReleaseDC_(GetDesktopWindow_(), hDC)
      SaveImage(lImage, Filename)
    ;}
  CompilerEndSelect
EndProcedure

Enumeration
#CTRLA
EndEnumeration

OpenWindow ( 0 , 388, 23, 414, 182, "GoScreen" , #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar )

AddKeyboardShortcut(0, #PB_Shortcut_Control | #PB_Shortcut_A, #CTRLA)

Repeat
Event = WaitWindowEvent()

If Event = #PB_Event_Menu
  Select EventMenu()
   Case #CTRLA
     Desktop_MakeScreenshot("C:\Users\Shinao\Desktop\Screens\screenshot"+Str(Date())+".jpg")
   EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
Merci d'avance.
PS : Cette utilitaire me permettrait de prendre des screenshots en jeu donc plein écran, si ça peux aider

Edit : lors d'un delay(), je peux mettre la fenêtre en background , le screenshot se prend.. :?:
Donc je me doute que je dois utiliser une autre méthode que celui du addkeyboardshorcut, cependant les API et les event windows je ne connais pas, quelqu'un pourrait m'éclairer ou me donner un bout de code?
Shinao
Messages : 137
Inscription : dim. 21/sept./2008 13:00

Re: ImprimEcran impossible quand fenetre en background

Message par Shinao »

J'ai testé avec le Repeat If GetAsyncKeyState_ ( #VK_F10)...
Parreil, le programme ne doit pas être en background...

Cependant si je fais une boucle infinie :

Repeat
If GetAsyncKeyState_ ( #VK_F10)
Desktop_MakeScreenshot("C:\Users\Shinao\Desktop\Screens\screenshot"+Str(Date())+".jpg")
EndIf
Until quit = 1

Alors je pourrais faire les screenshots même si il est en background, mais quand je suis en jeu, aucun screens sont pris...

Autres solutions ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: ImprimEcran impossible quand fenetre en background

Message par Backup »

tiens !!

attention ce code créer un dossier screenshot dans c:
et y place la capture , et ceux, des l'appui sur la touche control gauche seule !
( un beep se fait entendre )...

Code : Tout sélectionner

;@author Progi1984

Procedure Desktop_MakeScreenshot(Filename.s) 
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Linux ;{
      Protected lProgram.l
      RunProgram("import", "-silent -window root "+GetFilePart(Filename), GetPathPart(Filename))
      ;}
    CompilerCase #PB_OS_Windows ;{
      Protected lImage.l
      Protected hdc.l
      lImage = CreateImage(#PB_Any, GetSystemMetrics_(#SM_CXSCREEN),GetSystemMetrics_(#SM_CYSCREEN))
      hdc = StartDrawing(ImageOutput(lImage))
        BitBlt_(hdc,0,0,ImageWidth(lImage),ImageHeight(lImage),GetDC_(GetDesktopWindow_()), 0, 0, #SRCCOPY)
      StopDrawing()
      ReleaseDC_(GetDesktopWindow_(), hdc)
      SaveImage(lImage, Filename)
      ;}
  CompilerEndSelect
EndProcedure

Enumeration 
  #Window_0
EndEnumeration

OpenWindow ( #Window_0 , 388, 23, 414, 182, "GoScreen" , #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar )


Repeat
  
  Select EventWindow()					
    Case #Window_0 ;		
      event = WaitWindowEvent(10)
      
      If  GetAsyncKeyState_(#VK_LCONTROL)    ; test l'appuis sur Ctrl gauche
        beep_(400,100)
        If FileSize("C:\screenshot") <> -2
          CreateDirectory("C:\screenshot") 
        EndIf
        
        Desktop_MakeScreenshot("C:\screenshot\"+Str(Date())+".jpg") 
      EndIf
  EndSelect
Until event = #PB_Event_CloseWindow
Shinao
Messages : 137
Inscription : dim. 21/sept./2008 13:00

Re: ImprimEcran impossible quand fenetre en background

Message par Shinao »

Bonsoir

Merci, même si je comprend pas bien le changement( dans le waitwindowevent),
Cela marche en background, malheuresement, ça reste innéficace dans un jeu plein écran. :[

Serais-tu comment faire ?

merci pour ton aide.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: ImprimEcran impossible quand fenetre en background

Message par Backup »

Shinao a écrit : Serais-tu comment faire ?

merci pour ton aide.
ben ptete en tapant "capture d'ecran" sur la recherche du forum ?
qu'en pense tu ?
Shinao
Messages : 137
Inscription : dim. 21/sept./2008 13:00

Re: ImprimEcran impossible quand fenetre en background

Message par Shinao »

J'ai cherché et j'ai en effet trouvé pas mal de méthode pour des screenshots mais aucune servant en jeu, logique car ça n'a pas de rapport avec les captures d'écran mais avec le fonctionnement du programme sur les tiers.

J'ai aussi cherché sur le forum anglais sans réponse, parreil sur les librairy mais toujours le même problème.

Merci d'avance.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: ImprimEcran impossible quand fenetre en background

Message par Backup »

faut savoir que lorsque tu lance un jeu celui ci se met dans une fenetre !!

la solution conciste a chercher cette fenetre et son handle (findwindow_())
et c'est ce handle qu'il faut utiliser pour la copie BitBlt_() ;)



enfin,c'est comme ça que je ferai...
Shinao
Messages : 137
Inscription : dim. 21/sept./2008 13:00

Re: ImprimEcran impossible quand fenetre en background

Message par Shinao »

Merci pour ta réponse,

Findwindow me permet de connaître le niveau de priorité de la fenêtre si j'ai bien compris ?
Mais que permet de faire BitBlt() ?

Je dois utiliser BitBlt pour récupérer l'image de la fenêtre pour la désinné sur le programme ?

merci d'avance
Shinao
Messages : 137
Inscription : dim. 21/sept./2008 13:00

Re: ImprimEcran impossible quand fenetre en background

Message par Shinao »

J'ai testé de cette façon :

Code : Tout sélectionner

HandleMw2.l = FindWindow_(NULL, "Modern Warfare 2")
ReleaseDC_(HandleMw2, hdc)
Le screen se prend quand on est sur le bureau mais toujours pas dans le jeu...

De plus, je n'ai pas le son lors de l'appui de la touche quand je suis en jeu, donc le addkeyboardshorcut ne fonctionne pas quand je suis dans le jeu...

Comment réglé le problème ?

merci d'avance
Répondre