begin process at 2008 08 30 01:26:50
1 233 969 membres
8 nouveaux aujourd'hui
14 294 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Savoir si une application est en plein écran [ Divers / Débutant(e) ] (bionicleman)

Savoir si une application est en plein écran le 26/03/2008 15:19:55

bionicleman
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 [ Lien ]
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

Re : Savoir si une application est en plein écran le 26/03/2008 18:29:55

rt15
Membre Club
Réponse acceptée !
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


Re : Savoir si une application est en plein écran le 26/03/2008 20:02:10

bionicleman
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 =)

Re : Savoir si une application est en plein écran le 27/03/2008 06:54:05

bionicleman
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;

Re : Savoir si une application est en plein écran le 27/03/2008 16:42:55

rt15
Membre Club
Réponse acceptée !
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.

Re : Savoir si une application est en plein écran le 27/03/2008 18:14:15

bionicleman
Bonjour bonjour !!
Tout d'abord, merci à toi rt15 pour ces conseils que j'vais suivre =D
Mon programme marche parfaitement grâce à toi !



Re : Savoir si une application est en plein écran le 27/03/2008 19:10:20

cirec
Membre Club
(Admin CS)
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


Re : Savoir si une application est en plein écran le 28/03/2008 12:23:28

rt15
Membre Club
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.


Classé sous : application, handle, position, veille, winrect

Participer à cet échange

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS