Page 1 sur 2

Comment détecter si un jeu externe est lancé ?

Publié : mar. 03/déc./2013 11:09
par Ar-S
Suite à ce topic, j'ai bien réussi à désactiver mon openwindowscreen lorsque la fenêtre de mon lecteur n'a plus le focus.

Seulement j'aimerai que cela se produise uniquement lorsqu'un exe externe (de jeu par exemple) ouvre une fenêtre directx.
Je sais que certains antivirus y arrivent (il se mettent en mode basse conso de ressources lorsqu'un jeu est lancé).

Y'en a t ils parmi vous qui sachent comment procéder ?

Re: Comment détecter si un jeu externe est lancé ?

Publié : mar. 03/déc./2013 11:32
par Backup
c'est vrais que je trouvais nul que ton Spectrum , disparaisse a la perte du Focus de ta fenetre :)

j'ai aussi éé confronté a ton probleme , lorsque j'ai vu que ça donnait comme toi une perte de l'affichage
du Screen lorsqu'on pert le focus , je suis revenu en arriere ....
je prefere que mon affichage continue, en arriere plan ...
pour un jeux plein ecran... ça reste un probleme..


System Mike Gyver ...
peut etre en testant le pixel du coin inferieur droit de l'ecran (du bureau )
lorsqu'on est en plein ecran Jeux, en general l'ecran deviens noir au moins une fois :)
alors que sinon , c'est la barre des taches :)
si tu ajoute la perte de focus, tu peut etre sur qu'un jeux a été lancé :)

(rhooooo ... chui trop fort :lol: )

Re: Comment détecter si un jeu externe est lancé ?

Publié : mar. 03/déc./2013 11:41
par Ar-S
Pas con ton idée de pixel même si pour être plus juste, j'opterai pour les 4 pixels des 4 angles car un utilisateur peu avoir sa barre sur les 4 cotés de son bureau. Si quelqu'un à une solution plus "noble" je suis tout de même preneur.

Re: Comment détecter si un jeu externe est lancé ?

Publié : mar. 03/déc./2013 11:43
par Backup
Ar-S a écrit :Pas con ton idée de pixel
parceque tu supposes que d'habitude , mes idées sont con ?

:lol: :lol:

Re: Comment détecter si un jeu externe est lancé ?

Publié : mar. 03/déc./2013 11:45
par Ar-S
Non je veux dire que lorsque tu ne radotes pas, tes idées sont bonnes, les médocs ont l'air de marcher :mrgreen:

Re: Comment détecter si un jeu externe est lancé ?

Publié : mar. 03/déc./2013 13:01
par case
la barre des taches n'est pas toujours au même endroit j'en vois souvent sur le coté ou en haut de l’écran.

Re: Comment détecter si un jeu externe est lancé ?

Publié : mar. 03/déc./2013 13:35
par Backup
oui , ben tester les 4 coins et faire une moyenne

ça tombe bien la moyenne de 0+0+0+0/4 = 0 :)

ou mettre 4 conditions .... ou additioner les 4 couleurs :)

Re: Comment détecter si un jeu externe est lancé ?

Publié : mar. 03/déc./2013 13:57
par Backup
chez moi ça marche nickel !

si vous lancez un jeux plein ecran
vous entendrez le beep() grave
et un requester affichera fierement qu'un jeux est lancé :)

lorsque vous aurez quitté le plein ecran , un beep aigue se fera entendre
qui prouvera la detection :)

Code : Tout sélectionner

;***********************************************
;Titre  :test si un  Jeux est Lancé en plein ecran
;Auteur  : Dobro
;Date  :03/12/2013
;Heure  :13:44:43
;Version Purebasic :  PureBasic 5.21 LTS (Windows - x86)
;Version de l'editeur :EPB V2.52
; Libairies necessaire : Aucune 
;***********************************************

Enumeration
	#win
EndEnumeration


Declare  Pxlcolor(X,Y)

global Flag

ExamineDesktops()
Hauteur = DesktopHeight(0)
Largeur= DesktopWidth(0)
OpenWindow(#win,100,100,100,100,"test",#PB_Window_SystemMenu)
mem_couleur=Pxlcolor(0,0) ; haut gauche
mem_couleur2=Pxlcolor(Largeur,0) ; haut droit
mem_couleur3=Pxlcolor(0,Hauteur) ;bas gauche
mem_couleur4=Pxlcolor(Largeur,Hauteur) ; Bas droit


repeat
	Select WindowEvent()
		Case #PB_Event_CloseWindow
		End
	EndSelect
	couleur=Pxlcolor(0,0) ; haut gauche
	couleur2=Pxlcolor(Largeur,0) ; haut droit
	couleur3=Pxlcolor(0,Hauteur) ;bas gauche
	couleur4=Pxlcolor(Largeur,Hauteur) ; Bas droit
	
	if couleur=mem_couleur and couleur2=mem_couleur2 and couleur3=mem_couleur3 and couleur4=mem_couleur4 and Flag=1
		Flag=0
		beep( 880,1000)
		MessageRequester("info","pleine ecran quitté !! ") 
	Endif
	
	if couleur+couleur2+couleur3+couleur4=<0
		beep( 440,1000)
		MessageRequester("info","Jeux lancé !! ") 
		Flag=1
	Endif
	
	
	Delay(20)
forever


Procedure Pxlcolor(X,Y)
	handle=GetDC_(GetDesktopWindow_())
	couleur=GetPixel_(handle,X,Y)
	ReleaseDC_(GetDesktopWindow_(),handle )
	ProcedureReturn couleur
EndProcedure 



; EPB

j'attends la question suivante : "hey , mais comment on sait qu'on a quitté le jeux plein ecran ??"

reponse : Facile :)
il suffit de mettre en memoire les 4 couleurs qui etaient au 4 coins de l'ecran , avant le lancement du jeux
si ces couleurs se représentent a nouveau , c'est qu'on a quitté le mode plein ecran du jeux :)

(ceci a été ajouté dans le code :) )

Re: Comment détecter si un jeu externe est lancé ?

Publié : mar. 03/déc./2013 15:31
par Ar-S
En effet ça fonctionne par contre dans la boucle (de moa radio) ça génère un lag de fou. Surement du au GetPixel_ en boucle.

Re: Comment détecter si un jeu externe est lancé ?

Publié : mar. 03/déc./2013 15:59
par Backup
bah oui

faut le mettre dans un Timer ... comme ça tu verifies si au bout de x secondes :) (pas trop long hein ) :)

Re: Comment détecter si un jeu externe est lancé ?

Publié : mar. 03/déc./2013 16:35
par Ar-S
Oui j'en ai déduis celà, seulement il me renvoie que FFFFFF cet âne.
J'ai tenté une approche de la sorte.

Tout d'abord 2 pixels opposées suffisent (en fait la barre sera toujours présente dans un angle opposée à l'autre)

Code : Tout sélectionner

Procedure.b CheckGame()
Protected c1.s , c2.s 

  	HDC = GetDC_(0)

	c1.s = RSet(Hex(GetPixel_(HDC,0,Hauteur)), 6, "0")
	c2.s = RSet(Hex(GetPixel_(HDC,Largeur,0)), 6, "0")
	
	Debug "C1 : " + c1
	Debug "C2 : " + c2
	
	If c1.s = "000000" And c2.s = "000000"
	 
		ProcedureReturn #GAME_ON
	Else
		ProcedureReturn #GAME_OFF
		
	EndIf 
	
EndProcedure
Me suis inspiré de ce topic

Re: Comment détecter si un jeu externe est lancé ?

Publié : mar. 03/déc./2013 17:02
par Ar-S
Je pense opter pour ton code, en fait il detecte bien le passage au noir. Me reste à gérer mes event avec ça.
(entre le fait que l'user puisse cacher l'affichage via le clique droit (sans fermer l'opanwindowsscreen) et du closescreen() qui doit se produire en plein ecran et revenir si la fenêtre a le focus, c'est un beau bordel).

Merci pour ton code en tout cas. :D

Re: Comment détecter si un jeu externe est lancé ?

Publié : mar. 03/déc./2013 17:31
par case
la fonction IsScreenActive() ca marche pas ?

Re: Comment détecter si un jeu externe est lancé ?

Publié : mar. 03/déc./2013 17:39
par Ar-S
case a écrit :la fonction IsScreenActive() ca marche pas ?
Salut case,

Iscreen est pour une fenêtre PB non ? La on parle de detecter le lancement d'un jeu externe.
Comme ceux ci se lancent toujours via un ecran noir, c'est cet événement que l'on chope pour désactiver l'openwindowscreen de notre programme PB afin qu'il ne freeze pas.

Re: Comment détecter si un jeu externe est lancé ?

Publié : mar. 03/déc./2013 19:14
par Backup
case a écrit :la fonction IsScreenActive() ca marche pas ?
j'ajouterai que IsScreenActive() previen si on perd le focus ..

mais dans notre cas, ça ne nous est pas utile parceque

notre prg dispose d'un ecran
lorsqu'on perd le focus parcequ'une autre fenetre d'un autre prg le recupere
nous on veux pouvoir continuer a dessiner dedans ... jusque la ok

mais on veux pouvoir garder norte affichage si un prg de Jeux plein ecran est lancé !

ce qui se passe actuellement, c'est que si on lance un prg de jeux plein ecran
et qu'on quitte ce prg de jeux (ou bascule Alt+tab)

notre petit prg avec son petit ecran perd l'affichage !! sans raison au passage !

le petit prg fonctionne toujours , mais plus d'affichage sur son petit ecran ....


d'ou l'astuce de regarder si un prg prend le plein ecran (m'etonnerai pas qu'il existe une API pour ça au passge )