Page 1 sur 1

Détecter qu'une application est en plein écran

Publié : jeu. 01/nov./2007 10:48
par lionel_om
Bonjour,

Je voudrais savoir si y'a un moyen de détecter si une application est en plein écran (full screen), genre un jeu, un lecteur de vidéos, un diaporama...

Merci d'avance
Lio

Publié : jeu. 01/nov./2007 11:59
par lionel_om
J'ai trouvé ce code là (adapté d'un forum VB France).

Code : Tout sélectionner

Procedure IsSimpleFullscreenWindow()
  Protected hWnd.l, r.RECT
  hWnd = GetForegroundWindow_()
  If ( GetWindowLong_(hWnd, #GWL_STYLE) & (#WS_MAXIMIZEBOX | #WS_MINIMIZEBOX | #WS_SYSMENU) ) = 0
    GetWindowRect_(hWnd, @r)
    If r\Bottom - r\Top >= GetSystemMetrics_(#SM_CYSCREEN) Or r\Right - r\Left >= GetSystemMetrics_(#SM_CXSCREEN)
      ProcedureReturn #True
    EndIf
  EndIf
EndProcedure
Si personne n'a mieux je vais utiliser celui là. Dans le cas contraire je suis preneur !
Lio :D

Publié : ven. 02/nov./2007 10:00
par brossden
Bonjour je pense que tu trouveras plus simple ce bout de code !

Code : Tout sélectionner

Zoom = IsZoomed_(GetForegroundWindow_())
La variable Zoom est Vrai (1) si la fenetre est maximisée ou Fausse (0) si ce n'est pas le cas !


Et un exemple pour tester :

Code : Tout sélectionner

Enumeration
  #Window_0
  #Button_0
  #Button_1
EndEnumeration
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 200, 200, 400, 200, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar |#PB_Window_MaximizeGadget )
    If CreateGadgetList(WindowID(#Window_0))
      ButtonGadget(#Button_0, 70, 50, 100, 30, "Maximise")
      ButtonGadget(#Button_1, 70, 90, 100, 30, "Est-ce Max")
    EndIf
  EndIf
EndProcedure
Open_Window_0()
Repeat
  Event = WaitWindowEvent()
  GadgetID = EventGadget()
  If Event = #PB_Event_Gadget
    If GadgetID = #Button_0
      If IsZoomed_(GetForegroundWindow_()) 
        ShowWindow_(GetForegroundWindow_(),#SW_NORMAL)
        SetGadgetText(#Button_0,"Maximise")
      Else
        ShowWindow_(GetForegroundWindow_(),#SW_MAXIMIZE)
        SetGadgetText(#Button_0,"Retour normal")
      EndIf
    ElseIf GadgetID = #Button_1
      Zoom= IsZoomed_(GetForegroundWindow_())
      If Zoom
        MessageRequester("État de la fenetre", "La fenetre est maximisée")
      Else
        MessageRequester("État de la fenetre", "La fenetre n'est pas maximisée")
      EndIf
    EndIf
  EndIf
Until Event = #PB_Event_CloseWindow
End

Publié : ven. 02/nov./2007 10:09
par tmyke
Je viens d'essayer vos deux codes, et aucun ne fonctionne, par exemple lorsque
je lance un code Dreamotion3D en FullScreen, les deux fonctions retourne malgrés
tout toujours 0
:?

Publié : ven. 02/nov./2007 10:13
par brossden
Pour tmyke

teste l'exemple que j'ai inclus tu verras normalement que cela fonctionne bien !

Je suis en windows XP Pro et Purebasic V 4.10 Beta 2

Publié : ven. 02/nov./2007 10:28
par tmyke
Oui tu as raison, mais tu es toujours en mode fenetré, pas vraiment en Fullscreen.

lionel_om disait initalement
lionel_om a écrit :...
Je voudrais savoir si y'a un moyen de détecter si une application est en plein écran (full screen),
genre un jeu, un lecteur de vidéos, un diaporama...
...
et dans ce cas la, vos code ne semble pas etre fiable à 100%... (exemple
codes DM3D en FullScreen).

Publié : ven. 02/nov./2007 10:44
par Backup
tmyke a écrit :Oui tu as raison, mais tu es toujours en mode fenetré, pas vraiment en Fullscreen.

lionel_om disait initalement
lionel_om a écrit :...
Je voudrais savoir si y'a un moyen de détecter si une application est en plein écran (full screen),
genre un jeu, un lecteur de vidéos, un diaporama...
...
et dans ce cas la, vos code ne semble pas etre fiable à 100%... (exemple
codes DM3D en FullScreen).
ben oui ! mais a ma connaissance on ne peut pas lancer un mode Screen autrement qu'en plein ecran !!!

sinon c'est pas du Screen c'est du WindowScreen !! :)

Publié : ven. 02/nov./2007 11:02
par brossden
ok pour Fullscreen !

Nouveau code :

Code : Tout sélectionner

RunProgram("c:\MonPPS.pps")
Delay(2000)
Global hwnd.l, r.RECT
hwnd = GetForegroundWindow_()
GetWindowRect_(hwnd, @r)
ExamineDesktops()
If  r\top+r\bottom = DesktopHeight(0) And r\left+r\right = DesktopWidth(0)
  MessageRequester("Etat de la fenettre","Fullscreen")
Else
  MessageRequester("Etat de la fenettre","Fenêtré")
EndIf
Il faut bien evidement avoir un pps à afficher et mettre le bon nom d fichier dans RunProgram

Publié : ven. 02/nov./2007 11:20
par tmyke
ton dernier code fonctionne mieux, en tous les cas dans le cas d'appli DirectX en Fullscreen,
j'ai cette fois la bonne valeur.

Publié : ven. 02/nov./2007 13:02
par lionel_om
Merci brossden pour tes codes.
Par contre je cherchais un code qui ne considérait pas l'explorateur Windows comme une fenêtre par exemple.

En fait j'en ai besoin pour un programme qui tourne en background et qui peut-être mis en veille qd on lance un jeu ou autre (pour ne pas ralentir une grosse application). Donc, je ne peux pas juste tester la taille de la fenêtre.

Je vais tout de même faire quelques tests avec tes deux codes et voir cet fonction de l'API Windows.

Merci bien de votre aide.
Lio :D

Publié : ven. 02/nov./2007 14:05
par brossden
Il te suffit de faire un thread ce qui ne consomme partiquement pas de ressource !

Publié : ven. 02/nov./2007 14:31
par lionel_om
En fait je suis en train de faire un programme pour changer le WallPaper du bureau. Et donc je voudrais qu'il se mette en pause quand un jeu ou un film est lancé en plein écran. Car j'ai vu qu'avec Media Player Classic, lors d'un changement de WallPaper, certaines vidéos posent des problèmes d'affichage.

Donc le programme en lui même ne consomme rien en ressource, sauf lors du changement d'image : conversion d'un JPG en BMP (avec redimension si format portait).

Lio

Publié : dim. 04/nov./2007 9:24
par brossden
alors justement teste si une appli est plein ecran ou maximisée avant de faire un changement de papier peint ! et tu n'auras pas ce problème !
Donne nous du code pour que l'on puisse t'aider !

Publié : dim. 04/nov./2007 16:10
par lionel_om
Ma fonction actuelle est ainsi :

Code : Tout sélectionner

Procedure IsSimpleFullscreenWindow()
  Protected hWnd.l, r.RECT, txt.s
  hWnd = GetForegroundWindow_()
  If ( GetWindowLong_(hWnd, #GWL_STYLE) & (#WS_MAXIMIZEBOX | #WS_MINIMIZEBOX | #WS_SYSMENU) ) = 0
    GetWindowRect_(hWnd, @r)
    If r\Bottom - r\Top >= GetSystemMetrics_(#SM_CYSCREEN) Or r\Right - r\Left >= GetSystemMetrics_(#SM_CXSCREEN)
      txt = Space (256)
      GetWindowText_ (hwnd, txt, 256)
      If txt <> "Program Manager" And txt <> #NULL$
        ProcedureReturn #True
      EndIf
    EndIf
  EndIf
EndProcedure
Ça semble pas trop mal marcher, mais c'est sans doute perfectible. Mais je préfère que le "diaporama" continu alors qu'un jeu est lancé plutôt que le diaporama ne cesse de s'arrêter.

Lio