begin process at 2010 02 10 12:05:58
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Divers

 > 

Débutant(e)

 > 

Savoir si une application est en plein écran


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Savoir si une application est en plein écran

mercredi 26 mars 2008 à 15:19:55 | Savoir si une application est en plein écran

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
mercredi 26 mars 2008 à 18:29:55 | Re : Savoir si une application est en plein écran

rt15

Membre Club Administrateur CodeS-SourceS
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

mercredi 26 mars 2008 à 20:02:10 | Re : Savoir si une application est en plein écran

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 =)
jeudi 27 mars 2008 à 06:54:05 | Re : Savoir si une application est en plein écran

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;
jeudi 27 mars 2008 à 16:42:55 | Re : Savoir si une application est en plein écran

rt15

Membre Club Administrateur CodeS-SourceS
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.
jeudi 27 mars 2008 à 18:14:15 | Re : Savoir si une application est en plein écran

bionicleman

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


jeudi 27 mars 2008 à 19:10:20 | Re : Savoir si une application est en plein écran

cirec

Membre Club Administrateur CodeS-SourceS
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

vendredi 28 mars 2008 à 12:23:28 | Re : Savoir si une application est en plein écran

rt15

Membre Club Administrateur CodeS-SourceS
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.


Cette discussion est classée dans : application, handle, position, veille, winrect


Répondre à ce message

Sujets en rapport avec ce message

allumer éteindre / veille [ par Maniaxman ] bonjour, j'ai trouvé ces deux fonctions si pour allumer et éteindre l'écran : SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 1);//é Traducteur Delphi please ! [ par minipod ] Un sympatique delphinaute m'a dit de faire ceci pour résoudre mon problème. Le problème c'est que je sais pas faire çà en Delphi. Est-ce que quelqu'un position fenetre active [ par desstrain ] Bonjour, je suis parvenu a récuperer la position de ma fenetre delphi grace à la methode  : Screen.ActiveForm.ClientOrigin; mais cela ne fonctionne p Désactiver un bouton d'une application extérieure [ par nabil351974 ] bonjour à toutes et à tous, comme le titre l'indique, y a -t-il un moyen de désactiver un bouton d'une application extérieure après un nombre de cliq Trouver le nom d'un contrôle à partir de son handle ... [ par jnmchl ] Bonjour,Je cherche à récupérer le nom d'un contrôle à partir de son handle. Bien sûr le contrôle concerné se situe dans une autre application que je v Reconnaitre et fermer une application sans handle [ par jmp77 ] Bonjour à tous et toues,Voilà je voudrais pouvoir retrouver tous les processes qui tournent sur mon pc. Pour les process qui ont un handle je sais à p Affichage dans une fenetre directX [ par blackharu ] bonjour,Voilà j'ai une application faite avec directX dont je n'est pas les sources...Cependant en utilisant des fonctions windows...j'arrive à recupé Comment selectionner le texte d'une autre application ? [ par globule ] Bonjour, Comment selectionner le texte d'une autre application (en ayant son handle)J'ai trouvé la commande pour copier le texte :SendMessage(Handle, récupérer le handle de winzip [ par hysteria74 ] Bonjour,grace à la fonction ci dessous, je lance mon programme winzip pour zipper un fichier contenue dans le chamein (concatenation)ShellExecute( App Récupération de police dans un HANDLE [ par vmsn ] Bonjour, Voilà j'ai actuellement une application à réaliser qui contrôle une autre application (je réalise un module d'administration pour les modérat


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,577 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales