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 :

[D7][W10] Pb de fermeture d'une application externe


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut [D7][W10] Pb de fermeture d'une application externe
    Bonjour,

    j'essaye d'ouvrir, puis de fermer une application externe (TosExtMng.exe) :

    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
    { ===================================================================== }
    procedure TF_Princ.Btn_Test2Click(Sender: TObject);
    Var aHandle : THandle;
      Prog : String ;
    begin
      Prog := '"C:\Program Files (x86)\TOSHIBA\HDD Password Tool\TosExtMng.exe"' ;
      ShellExecute(Handle,'open',PChar(Prog),nil,nil,SW_SHOWNORMAL);
      aHandle := FindWindow('HDD Password Tool', Nil );
      If aHandle > 0  Then
        Begin
          ShowMessage('Fenêtre HDD Password Tool trouvée') ;
          SendMessage(aHandle, WM_CLOSE, 0, 0) ;
        End
      Else
        ShowMessage('Fenêtre HDD Password Tool non trouvée') ;
    End;
    { ===================================================================== }
    L'appli TosExtMng.exe se lance bien, mais Delphi ne trouve pas la fenêtre principale de l'appli ('HDD Password Tool')

    Pourtant WinSpy++ me donne bien ce Caption pour la fenêtre qui s'est ouverte.

    Je ne comprends pas pourquoi le FindWindow ne la trouve pas ?

    Merci pour vos idées

    A+
    Charly

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Bonsoir,
    Et si tu temporisais un peu la recherche de la fenêtre, au cas où elle ne soit pas créée au moment où tu la cherches ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tmax := Now() + delai ;
    repeat
     aHandle := FindWindow('HDD Password Tool', Nil );
    until (aHandle > 0) or (Now > tmax);
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Tu peux utiliser aussi un CreateProcess pour monitorer non pas la fenêtre mais directement le thread du process via un WaitSingleObjet dans un thread, prend exemple sur ma fonction CallCmd voire le TSLTShellExecuteWrapper.Execute, dans un portail, si l'on coupais le portail, cela coupait aussi toutes les autres applications via une liste des handles ouverts (nécessaires en CITRIX pour libérer complètement la session)

    Sinon, je confirme la patience, après tout, une application peut avoir des choses à faire avant d'ouvrir une fenêtre, faut laisser du temps au calcul.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Merci à vous 2, j'essaye déjà la solution de Tourlourou (bien que j'avais déjà essayé avec un While sans succès).

    A+
    Charly

  5. #5
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    ça ne fonctionne toujours pas. J'ai même mis un showmessage pour laisser le temps à la fenêtre de s'afficher :

    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
    { ===================================================================== }
    procedure TF_Princ.Btn_Test2Click(Sender: TObject);
    Var aHandle : THandle;
      Prog : String ;
      Tmax, Delai : Extended ;
    begin
      Prog := '"C:\Program Files (x86)\TOSHIBA\HDD Password Tool\TosExtMng.exe"' ;
      ShellExecute(Handle,'open',PChar(Prog),nil,nil,SW_SHOWNORMAL);
      ShowMessage('Appli lancée') ;
      Delai := 1/24/60 ;
      Tmax := Now() + Delai ;
      Repeat
       aHandle := FindWindow('HDD Password Tool', Nil );
      Until (aHandle > 0) or (Now > tmax);
    //    aHandle := FindWindow('HDD Password Tool', Nil );
      If aHandle > 0  Then
        Begin
          ShowMessage('Fenêtre HDD Password Tool trouvée') ;
          SendMessage(aHandle, WM_CLOSE, 0, 0) ;
        End
      Else
        ShowMessage('Fenêtre HDD Password Tool non trouvée') ;
    End;
    { ===================================================================== }
    Je vais tester la solution de Shai

    A+
    Charly

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Attention à l'ordre des paramètres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FindWindow(nil, 'HDD Password Tool');

  7. #7
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Je dois mal m'y prendre, mais Callcmd ne me rends pas la main ? :

    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
    { ===================================================================== }
    procedure TF_Princ.Btn_Test2Click(Sender: TObject);
    Var aHandle : THandle;
      Prog : String ;
      ExitCode : Int64 ;
      OutputText, ErrorText : String ;
    //  Delay : Cardinal ;
    begin
      Prog := '"C:\Program Files (x86)\TOSHIBA\HDD Password Tool\TosExtMng.exe"' ;
    //  ShellExecute(Handle,'open',PChar(Prog),nil,nil,SW_SHOWNORMAL);
      Delay := 1 ;
      CallCmd('C:\Program Files (x86)\TOSHIBA\HDD Password Tool', 'TosExtMng.exe',
              '', ExitCode, OutputText, ErrorText) ;
      ShowMessage('Appli lancée'+Chr(13)+ OutputText+Chr(13)+ ErrorText) ;
      aHandle := FindWindow('HDD Password Tool', Nil );
      If aHandle > 0  Then
        Begin
          ShowMessage('Fenêtre HDD Password Tool trouvée') ;
          SendMessage(aHandle, WM_CLOSE, 0, 0) ;
        End
      Else
        ShowMessage('Fenêtre HDD Password Tool non trouvée') ;
    End;
    { ===================================================================== }
    L'appli TosExtMng.exe est bien lancée, mais mon Showmessage ne s'exécute que si je ferme la fenêtre de TosExtMng.exe.

  8. #8
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 345
    Points : 3 123
    Points
    3 123
    Par défaut
    Merci AndOrNot, c'est bien cela, j'ai inversé les 2 paramètres

    (j'avais bêtement repris un code sur internet sans vérifier !!)

    ça fonctionne parfaitement maintenant :

    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
    procedure TF_Princ.Btn_Test2Click(Sender: TObject);
    Var aHandle : THandle;
      Prog : String ;
      Tmax, Delai : Extended ;
    begin
      Prog := '"C:\Program Files (x86)\TOSHIBA\HDD Password Tool\TosExtMng.exe"' ;
      ShellExecute(Handle,'open',PChar(Prog),nil,nil,SW_SHOWNORMAL);
      ShowMessage('Appli lancée') ;
      Delai := 1/24/60 ;
      Tmax := Now() + Delai ;
      Repeat
        aHandle := FindWindow(Nil, 'HDD Password Tool');
      Until (aHandle > 0) or (Now > tmax);
    //    aHandle := FindWindow(Nil, 'HDD Password Tool');
      If aHandle > 0  Then
        Begin
          ShowMessage('Fenêtre HDD Password Tool trouvée') ;
          SendMessage(aHandle, WM_CLOSE, 0, 0) ;
        End
      Else
        ShowMessage('Fenêtre HDD Password Tool non trouvée') ;
    End ;
    Merci à vous 3

    A+
    Charly

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

Discussions similaires

  1. Fermeture d'une application éxterne
    Par Matt2094 dans le forum Langage
    Réponses: 8
    Dernier message: 22/03/2006, 15h11
  2. Forcer la fermeture d'une application
    Par Bissada dans le forum Langage
    Réponses: 2
    Dernier message: 06/10/2005, 21h42
  3. fermeture d'une application après un temp d'inactivité?
    Par sitdown dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 24/08/2005, 15h44
  4. Détection de la fermeture d'une application
    Par vanitom dans le forum MFC
    Réponses: 6
    Dernier message: 19/08/2005, 18h11
  5. [Event]Annuler la fermeture d'une application
    Par willowII dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 16/11/2004, 09h28

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