IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

Comment savoir quelle fenêtre possède le focus ? [FAQ]


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut Comment savoir quelle fenêtre possède le focus ?
    Salut tout le monde.

    Il y a plusieurs fenêtres, j'ai mis du code dans l'évènement OnActivate de l'Application, mais j'ai besoin de savoir si une fenêtre précise détient le focus ou non.

    La propriété Focused, met False même si la fenêtre détient le focus, car c'est un composant de la fenêtre qui détient le focus.

    La solution serrait simple en utilisant la propriété Active sur la form et ainsi savoir si elle possède le focus ou non.

    Malheureusement, il y a un problème, quand l'utilisateur clique sur l'icône du logiciel alors qu'il est déjà lancé, une seconde instance se lance, trouve qu'il existe une première instance, lance un message Windows pour restaurer la première instance, puis se ferme.
    Dans ce cas précis, dans l'évènement OnActivate, la propriété Active de la form qui devrait être True vaut False.

    Connaissez-vous ce bug ? Peut-on passer par un autre moyen pour arriver à savoir si la form est celle active de l'application ?

    Merci.

  2. #2
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Salut, si tu utilises windows regarde sous les API.La fonction GetForegroundWindow: HWND retourne le handle de la fenetre que l'utilisateurs est en train de travailler.
    Il y a aussi GetFocus qui retourne le handle de la fenetre qui détient le focus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure Exemple(Sender: TObject);
    var
       TheWindowText: array[0..255] of char;
       TheForegroundWindow: HWND;
    begin
       {get a handle to the foreground window}
       TheForegroundWindow := GetForegroundWindow;
     
       {get it's caption text}
       GetWindowText(TheForegroundWindow, TheWindowText, 255);
     
       {display the foreground window's caption}
       Label2.Caption := 'Foreground Window Text: ' + TheWindowText;
    end;
    bonne chance.

  3. #3
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Salut wiglaft, merci pour ton aide, tu m'aides beaucoup.
    C'est presque parfait.

    Malheureusement presque, car il arrive un cas qui ne fonctionne pas encore, voici le code que je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        if GetForegroundWindow <> fFormPrincipale.Handle then
        begin
          GetWindowText( GetForegroundWindow, TheWindowText, 255 );
          if TheWindowText <> Application.Title then
          begin
            bitLegende.Caption := TheWindowText;
            Exit;
          end;
        end;
    Quand la première instance de l'application a une fenêtre autre que la MainForm en avant plan et que c'est une seconde instance qui lance la première instance.
    le GetForegroundWindow est différent du Handle car ce ne sont pas les même instances, le TheWindowText est égal au Title de l'application car les 2 instances sont des instances de la même application, mais il n'y a pas moyen de tester quelle est la fenêtre qui aurra le focus dans la première instance au moment de ce test.

    Dans ce cas, GetForegroundWindow retourne le Handle de la second instance et le GetWindowText retourne le Title de la seconde instance. Donc pas de test sur la fiche "active" de la première instance.

    Je ne sais pas si j'ai été assez clair.

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 15
    Points : 16
    Points
    16
    Par défaut
    Allo, je ne sais pas comprend l'anglais mais voici 2 api windows qui sont intéressant et qui pourrait t'aider dans ton projet.


    GetActiveWindow: HWND; {returns a handle to the active window}

    Description
    La fonction retourne le handle de la fenetre active associée avec le processus de la fonction appelante.

    http://msdn.microsoft.com/library/de...tivewindow.asp

    GetTopWindow(
    hWnd: HWND {a handle of a parent window}
    ): HWND; {returns a handle to a child window}

    Description
    Cette fonction examine les fenêtres d'enfant de la fenêtre parent passé en parametre, et renvoie le handle de la fenêtre enfant au haut Z-ordre relativement à ses enfants de mêmes parents.

    Seulement pour les fenetres enfants de mêmes parents. Si les fenêtres d'enfant ont les fenêtres d'enfant elles-mêmes, elles sont exclues.

    http://msdn.microsoft.com/library/de...ttopwindow.asp


    bonne chance dans ton projet

  5. #5
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Merci pour ta recherche, ça ne marche pas encore vraiment, je vais voir comment on peut imbriquer ces fonctions afin de résoudre le problème.
    J'espère que ça marchera.

Discussions similaires

  1. Comment savoir quelle application a le focus
    Par wisar dans le forum Windows
    Réponses: 11
    Dernier message: 03/09/2007, 12h24
  2. Savoir quel composant possède le focus
    Par ero-sennin dans le forum C++Builder
    Réponses: 4
    Dernier message: 18/09/2006, 22h36
  3. [Process] Comment savoir quelle application est ouverte ?
    Par samus535 dans le forum Framework .NET
    Réponses: 1
    Dernier message: 25/08/2006, 15h01
  4. Comment savoir la fenêtre d'une applet est réduite ?
    Par skilachi dans le forum Applets
    Réponses: 3
    Dernier message: 01/08/2006, 17h35
  5. Comment savoir quelle version d'MSXML IE utilise?
    Par trent94 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 17/07/2005, 18h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo