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 récupérer le handle d'une fenêtre seulement depuis un Mutex ?


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut Comment récupérer le handle d'une fenêtre seulement depuis un Mutex ?
    Salut à tous

    J'ai créé un Mutex pour limiter le lancement de mon application à une seule fois.
    Seulement, j'aimerais maintenant passer l'application au premier plan si elle est déjà lancée et également, pouvoir envoyer des messages à cette application.

    Je me suis servi de cette entrée de la FAQ: http://delphi.developpez.com/faq/?pa...tion#1instance pour le mutex.

    Seulement, si je passe le handle du mutex créé dans SetForegroundWindow, évidemment, ça ne fonctionne pas...
    Je sais bien qu'il existe FindWindow mais, problème, le Caption de la fiche en question est variable

    La question est donc:
    Comment récupérer le handle de la fenêtre ou de l'application déjà lancée depuis le mutex récupéré?

    merci d'avance
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Par défaut
    Pourquoi ne pas utiliser la base de registres pour stocker le handle de la fenêtre à afficher ? La première instance de l'appli écrit son handle de fenêtre, et la seconde instance, détectant le mutex créé, lit le handle et appelle SetForegroundWindow.

  3. #3
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Salut Reisubar

    Merci pour ta réponse

    En fait, que ce soit la BDR ou bien un fichier, je trouve que ça fait "sale". J'aimerais éviter autant que possible l'ajout de machins temporaires de cet acabit C'est déjà assez le foutoir sur les ordis et dans la BDR comme ça
    En revanche, si ce n'est pas possible comme je recherche, tu viens de me donner une solution de rechange
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  4. #4
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Salut Pedro

    J'ai fait ceci récemment.
    Parallèlement au Mutex je définis un Message via RegisterWindowMessage. Dans le DPR, lors de l'échec à la création du mutex je diffuse le message en broadcast qui sera traité par la 1° instance.

    le DPR:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    var
      hMutex: Cardinal;
    begin
      MyMsg := RegisterWindowMessage('RestoreMyAppMessage');
      SetLastError(NO_ERROR);
      hMutex := CreateMutex(nil, False, 'MyAppMutex');
      if GetLastError = ERROR_ALREADY_EXISTS then
        PostMessage(HWND_BROADCAST, MyMsg, 0, 0)
      else
      begin
        Application.Initialize;
        Application.CreateForm(TForm1, Form1);
        Application.Run;
        if hMutex <> 0 then
          ReleaseMutex(hMutex);
      end;
    end.
    et dans la form principale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
        procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      MyMsg: Cardinal;
     
    implementation
     
    {$R *.dfm}
     
    { TForm1 }
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnMessage := AppMessage;
    end;
     
    procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
    begin
      if Msg.message = MyMsg then
      begin
        Application.Restore;
        SetForegroundWindow(Application.MainForm.Handle);
        Handled := True;
      end;
    end;
    A noter bizarrement que parfois l'appli est bien mise au 1° plan, et parfois le bouton de la barre des tâches clignote en orange, sans vraiment comprendre pourquoi.

    @+ Claudius

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Par défaut
    A noter bizarrement que parfois l'appli est bien mise au 1° plan, et parfois le bouton de la barre des tâches clignote en orange, sans vraiment comprendre pourquoi.
    L'utilisation de SetForegroundWindow est très stricte, il y a des tonnes de conditions qui font que Windows peut refuser de faire passer ta fenêtre au premier plan (cf MSDN). En l'occurence, si ton application est inactive (pas le focus), elle ne peut pas forcer à se réafficher, ce qui explique le clignotement que tu expliques. Pour que ca marche à coup sûr, il faut que ce soit l'application active qui initie l'affichage, c'est à dire qu'il faut que tu connaisses le handle de l'autre instance... voilà pourquoi je passais par le registre

  6. #6
    Expert confirmé
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Par défaut
    Citation Envoyé par Reisubar Voir le message
    Pour que ca marche à coup sûr, il faut que ce soit l'application active qui initie l'affichage, c'est à dire qu'il faut que tu connaisses le handle de l'autre instance...
    Le SetForegroundWindow sera bien appelé par la 1° instance (donc avec son handle connu), la 2° se limitant à faire un broadcast. D'où mes questions "existentielles" sur ces 2 types de comportements.

    A noter que je n'ai pas cherché plus avant, le résultat me suffisant globalement.

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer le handle d'une fenêtre précise
    Par AMS010 dans le forum Windows
    Réponses: 1
    Dernier message: 04/07/2008, 16h11
  2. comment obtenir le handle d'une fenètre
    Par DarkPoster14 dans le forum Visual C++
    Réponses: 2
    Dernier message: 30/04/2008, 18h49
  3. Réponses: 14
    Dernier message: 02/04/2008, 22h17
  4. Réponses: 3
    Dernier message: 26/07/2007, 18h28
  5. Coment récupérer le handle d'une fenêtre
    Par robocop2776 dans le forum MFC
    Réponses: 2
    Dernier message: 30/10/2005, 22h21

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