Savoir si une application est en plein écran

[Résolu]
Signaler
Messages postés
8
Date d'inscription
mardi 13 mars 2007
Statut
Membre
Dernière intervention
9 avril 2008
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Bonjour,
Je suis entrain de développer une application et je voudrais qu'elle "remplace" le programme de mise en veille de windows.
J'ai un bout de code que j'ai fais. J'ai utilisé les fonctions FindWindow & GetWindowRect dont j'ai pris exemple http://www.greatis.com/delphicb/tips...erwinsize.html
Voilà mon code :

procedure TForm1.Timer1Timer(Sender: TObject);
var
Position: TPoint;
Handle: Thandle;
winrect: Trect;
begin
//timer de detection des mouvements de la souris et de mise en veille
GetCursorPos(Position);
label1.Caption:=inttostr(Position.Y);
label2.caption:=inttostr(Position.X);
if Position.X = mouseX then
begin
if Position.Y = mouseY then
begin
if form6.label3.caption='Activée'then
begin
Handle:=FindWindow(nil, 'Media Player Classic');
GetWindowRect(Handle, WinRect);
ifnot winrect.top=0then
begin
ifnot winrect.left=0then
begin
showmessage('veille on');
//SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 1);
end
else showmessage('veille off'); //partie de test si veille off
end;
end;
end;
end;
mouseX:=Position.X;
mouseY:=Position.Y;
end;

Le problème, c'est qu'aucun des deux message (veille on & veille off) ne s'affiche lors de l'execution du timer (les autres conditions étant vraies).

Merci

7 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
Salut,
form6.label3.caption='Activée'

Ce truc est syntaxiquement correcte, mais bon, il pique un peu les
yeux quand même, pour des raisons de perfs... (C'est encore le C qui
déteind sur mon Delphi ça...)
La comparaison de chaînes est plus lourde que la comparaison d'entiers
ou de Booléens. Poser un Boolean en private dans ta form peut améliorer
les perfs. M'enfin c'est un détail contestable...

Attention à l'indentation, mais ça, c'est peut être le copier coller.

if Position.X = mouseX then
begin
if Position.Y = mouseY then
begin
if form6.label3.caption='Activée'then
begin
Handle:=FindWindow(nil, 'Media Player Classic');
GetWindowRect(Handle, WinRect);
if not winrect.top = 0 then
begin
if not winrect.left = 0 then
begin
showmessage('veille on');
end
else
showmessage('veille off');
end;
end;
end;
end;

Avec l'indentation, on voit que le else se rapporte au winrect.left,
donc en cas de top = 0, rien ne se passe. Tu aurais probablement voulu
écrire :
if (winrect.top 0) and (winrect.left 0) then
showmessage('veille off')
else
showmessage('veille on');

Attention de vérifer le handle retourné par FindWindow (Comparer à 0. Si différent de 0, c'est ok).

Au fait, si c'est pour faire un écran de veille perso, pas besoin
d'aller si loin. Tu peux conserver le prog de windows, et faire un .exe
que tu renommes en heuuu... .scr si je ne m'abuse
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
not (winrect.Top=0) and (winrect.left=0)


Avec des tests multiples, il faut faire attention aux parenthèses ou bien connaitre la priorité des opérateurs.

Le not pourrait aussi bien s'appliquer sur le (winrect.Top=0) que sur le  ((winrect.Top=0) and (winrect.left=0))

La première solution a plusieurs avantages :

  Elle marche quel que soit le langage.

  Ceux qui lisent le code et qui ne connaissent pas l'ordre de priorité (Moi par exemple) comprennent quand même.

  Elle ne prend pas de place dans le cerveau.


Donc pour lever l'ambiguité :

not ((winrect.Top=0) and (winrect.left=0))


Plus généralement, tu devrais acquérir les méthodes te permettant de te dépatouiller de ce genre de problème tout seul.

Delphi possède un débogueur permettant par exemple de faire du pas à
pas dans les instructions, et d'espionner les valeurs des variables.


Bon, c'est vrai que dans ton cas, c'est un peu compliqué car tu dois
avoir le lecteur en plein écran... Mais rien ne t'empèche d'écrire
manuellement les valeurs de winrect dans un TMemo par exemple.


Pour finir, que tu ne tiennes pas compte de ma remarque sur la
comparaison de chaîne, je l'admet... Certaines personne pourraient la
contester.

Par contre, concernant le test du retour de FindWindow, là y a pas photo -> faut tester ! On emploit pas une handle (Ou une variable...) si on est pas sûr qu'il est OK.
Messages postés
8
Date d'inscription
mardi 13 mars 2007
Statut
Membre
Dernière intervention
9 avril 2008

Merci de cette réponse,
je n'ai pas le temps de voir ce code maintenant, je verrais ça plus tard.Mon programme est enfait un "concentré" de programme : avec je lance mes vidéos, mes musiques, je lance certains programmes lorsqu'ils sont arrêtés ; cette partie qui met en veille l'écran se déclanche losque je ne touche plus à la souris (Position.X mouseX,Position.Y mouseY), puis la partie avec FindWindow et GetWindowRect doit vérifier que mon player ne soit plus en plein écran [car mon player désactive automatiquement l'écran de veille losqu'il est ouvert. Vous pourrez me dire de le fermer mais je ne le fairais pas : j'ai une télécommande de mon lit, c'est le pied ].

Bonne soirée =)
Messages postés
8
Date d'inscription
mardi 13 mars 2007
Statut
Membre
Dernière intervention
9 avril 2008

Bonjour,
eh bien voilà j'ai testé le code, le message "veille off" s'affiche bien lorsque mon application n'est pas en plein écran, mais il s'affiche aussi lorsque mon application l'est...
procedure TForm1.Timer1Timer(Sender: TObject);
var
  Position: TPoint;
  Handle: Thandle;
  winrect: Trect;
begin
//timer de detection des mouvements de la souris et de mise en veille
  GetCursorPos(Position);
  label1.Caption:=inttostr(Position.Y);
  label2.caption:=inttostr(Position.X);
  if Position.X = mouseX then
  begin
    if Position.Y = mouseY then
    begin
      if form6.label3.caption='Activée' then
      begin
        Handle:=FindWindow(nil, 'Media Player Classic');
        GetWindowRect(Handle, WinRect);
        if not (winrect.Top=0) and (winrect.left=0) then
        begin
          showmessage('veille on');
          //SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 1);
        end
        else showmessage('veille off');
    end;
    end;
  end;
  mouseX:=Position.X;
  mouseY:=Position.Y;
end;
Messages postés
8
Date d'inscription
mardi 13 mars 2007
Statut
Membre
Dernière intervention
9 avril 2008

Bonjour bonjour !!
Tout d'abord, merci à toi rt15 pour ces conseils que j'vais suivre =D
Mon programme marche parfaitement grâce à toi !
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
Salut,

Pour connaitre l'état d'une application il y avait tout simplement :

Function GetAppState(Const aHandle : THandle):Integer;
Var Placement : TWindowPlacement;
Begin
  Placement.Length :=
SizeOf(TWindowPlacement);
  GetWindowPlacement(aHandle, @Placement);

  Result := Placement.showCmd;
End ;

//Pour tester un TButton et un TLabel
Procedure
Tfrm_Main.Button1Click(Sender: TObject);
Const StrState : Array[0..10] Of String[14] = ('HIDE', 'SHOWNORMAL', 'SHOWMINIMIZED',
'SHOWMAXIMIZED',
  'SHOWNOACTIVATE', 'SHOW', 'MINIMIZE', 'SHOWNA', 'RESTORE', 'SHOWDEFAULT', 'MAX');
Var HWnd :
THandle;
Begin
  HWnd :=
FindWindow( Nil , 'Éditeur
du Registre');
  If HWnd > 0Then

    Label1.Caption : = StrState[GetAppState(HWnd)]
  Else
    Label1.Caption := 'Application non trouvée';
End ;

Mais tu peux t'en servir plus simplement :

dans ton cas une fois que tu as le Handle du Média player :

If GetAppState(HandleMedia) = SW_SHOWMAXIMIZED Then
  ....

Mais je comprend pas vraiment ce que tu veux faire !!!!

Tu veux détecter si le screen saver est actif ou non ?
 
@+
Cirec

<hr siz="" />
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
Salut cirec.


En fait il veut remplacer le "programme" de Windows qui met l'ordinateur en veille.

Donc il "active la veille" au bout d'un certains temps d'inactivité...

Sauf si son lecteur est en plein écran (Donc il écoute de la musique, regarde une vidéo...).


if inactivité then

  if player pas en plein écran then

    activation de la veille;


Ta solution paraît pas mal. Par contre, il y a une petite nuance entre
"plein écran" (Avec le logiciel qui vire tout ce qui est caption et
barre d'état) et "maximized". Mais aucune des deux solutions ne fait la
différence il me semble.