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

Langage Delphi Discussion :

XE2, application en icône sur W7 à remettre en premier plan


Sujet :

Langage Delphi

  1. #1
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut XE2, application en icône sur W7 à remettre en premier plan
    Bonjour,

    J'ai créé une application mono instance à base de mutex.
    Sous Windows 7, quand l'application est en icône dans la barre de tâches et qu'elle reçoit le message pour se remettre sur le bureau, il ne se passe rien. J'ai vérifié que le message arrive bien en utilisant un ShowMessage juste avant le ShowWindow + SetForeground et la boite de message s'affiche bien.

    J'ai lu sur le net qu'avec Windows 7, ça pose un problème pour différentes raisons plus ou moins obscures.

    Questions:
    Est-ce qu'il existe un moyen de contourner ce problème ?
    Est-ce que ce problème se posera aussi sous Windows 8, OS pour lequel l'application est prévue au final ?

    Merci d'avance de vos avis

    Papy !

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    A la réception du message, au lieu d'utiliser SetForeground(), avez vous essayé Application.Restore; ?
    Philippe.

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    Je viens d'essayer, ça ne change rien

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Si l'application est minimisée, il faut d'abord la restaurer avant de lui donner le focus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.Restore;
    SetForegroundWindow(Handle);

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    ça ne fonctionne pas mieux.

    Voilà le code utilisé (trouvé dans un tuto sur ce problème)

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
     
    unit CheckPrevious;
     
    interface
     
    uses Forms, Windows, SysUtils, Dialogs;
     
    function RestoreIfRunning(const AppHandle: THandle;
      MaxInstances: integer = 1): boolean;
     
    implementation
     
    type
      PInstanceInfo = ^TInstanceInfo;
     
      TInstanceInfo = packed record
        PreviousHandle: THandle;
        RunCounter: integer;
      end;
     
    var
      MappingHandle: THandle;
      InstanceInfo : PInstanceInfo;
      MappingName  : string;
     
      RemoveMe: boolean = True;
     
    function RestoreIfRunning(const AppHandle: THandle;
      MaxInstances: integer = 1): boolean;
    begin
      Result := True;
     
      MappingName := StringReplace(ParamStr(0), '\', '',
        [rfReplaceAll, rfIgnoreCase]);
     
      MappingHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
        SizeOf(TInstanceInfo), PChar(MappingName));
     
      if MappingHandle = 0 then
        RaiseLastOSError
      else
      begin
        if GetLastError <> ERROR_ALREADY_EXISTS then
        begin
          InstanceInfo := MapViewOfFile(MappingHandle, FILE_MAP_ALL_ACCESS, 0, 0,
            SizeOf(TInstanceInfo));
     
          InstanceInfo^.PreviousHandle := AppHandle;
          InstanceInfo^.RunCounter     := 1;
     
          Result := False;
        end
        else // already runing
        begin
          MappingHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False,
            PChar(MappingName));
          if MappingHandle <> 0 then
          begin
            InstanceInfo := MapViewOfFile(MappingHandle, FILE_MAP_ALL_ACCESS, 0, 0,
              SizeOf(TInstanceInfo));
     
            if InstanceInfo^.RunCounter >= MaxInstances then
            begin
              ShowMessage('L''application est déjà en cours de d''exécution');
              RemoveMe := False;
              //if IsIconic(InstanceInfo^.PreviousHandle) then
                ShowWindow(InstanceInfo^.PreviousHandle, SW_RESTORE);
              SetForegroundWindow(InstanceInfo^.PreviousHandle);
            end
            else
            begin
              InstanceInfo^.PreviousHandle := AppHandle;
              InstanceInfo^.RunCounter     := 1 + InstanceInfo^.RunCounter;
     
              Result := False;
            end
          end;
        end;
      end;
    end; (*RestoreIfRunning*)
     
    initialization
     
    // nothing special here
    // we need this section because we have the
    // finalization section
     
    finalization
     
    // remove this instance
    if RemoveMe then
    begin
      MappingHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False,
        PChar(MappingName));
      if MappingHandle <> 0 then
      begin
        InstanceInfo := MapViewOfFile(MappingHandle, FILE_MAP_ALL_ACCESS, 0, 0,
          SizeOf(TInstanceInfo));
     
        InstanceInfo^.RunCounter := -1 + InstanceInfo^.RunCounter;
      end
      else
        RaiseLastOSError;
    end;
     
    if Assigned(InstanceInfo) then
      UnmapViewOfFile(InstanceInfo);
    if MappingHandle <> 0 then
      CloseHandle(MappingHandle);
     
    end. (*unit CheckPrevious*)

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    mouais... C'est l'inverse de ta question ; il n'y a pas de mutex, il n'y a pas de contrôle de réception mais juste un simili-test d'envoi et il n'y a pas de message
    Il manque un AttachThreadInput pour que SetForegroundWindow puisse fonctionner. Mais ça risque de coincer avec l'UAC. J'ai un doute que ce "tuto" fonctionne

    Il y a beaucoup d'exemples avec CreateMutex qui seront plus simple à appliquer qu'un fichier mappé. Ensuite envois un message personnel par PostMessage et traite les commandes citées plus haut depuis la cible.

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 385
    Points : 2 999
    Points
    2 999
    Par défaut
    C'est vrai que j'ai pas vraiment expliqué correctement.

    Le code que j'avais écris précédemment ne fonctionnait pas et je pensais que ça venait de SetForeground mais en fait ça venait du message qui ne passait pas. Je l'ai réécrite et cette fois, c'est tout bon.

    Merci

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

Discussions similaires

  1. Avis sur application en icône de barre des tâches
    Par ouiouioui dans le forum Débuter
    Réponses: 1
    Dernier message: 12/09/2008, 10h33
  2. Application en permance sur le bureau.
    Par deetox dans le forum Composants VCL
    Réponses: 11
    Dernier message: 27/08/2004, 00h44
  3. [VS.NET] Application asp1.1 sur IIS 5.1
    Par Estoril dans le forum Visual Studio
    Réponses: 8
    Dernier message: 02/05/2004, 17h10
  4. application qui connecte sur une page web
    Par spoolz dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 14/04/2004, 09h47
  5. Réponses: 7
    Dernier message: 17/07/2003, 11h00

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