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 :

Shellexecute, Sendmessage et handle


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 41
    Par défaut Shellexecute, Sendmessage et handle
    Hello,

    Alors j'ai une petite interrogation ( je m'y prend surement pas bien )

    Je lance une application externe via :
    ShellExecute(handle,'Open','C:\WINDOWS\system32\calc.exe',nil,nil,SW_SHOWNORMAL);

    Je souahiterai fermer à souhait cette appli depuis delphi
    via par exemple :
    SendMessage(handle,WM_CLOSE,0,0);

    Seulement comment connaitre le handle de l'application lancée par shellexecute ?

    merci d'avance pour toute pistes !

    ciao
    kioeev

  2. #2
    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,


    Pour ce faire j'utiliserais ShellExecuteEx au lieu de ShellExecute.

    Appel de l'application:
    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
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ExecuteInfo: TShellExecuteInfo;
    begin
      with ExecuteInfo do
      begin
        cbSize := Sizeof(ExecuteInfo);
        fMask := SEE_MASK_NOCLOSEPROCESS;
        Wnd := 0;
        lpVerb := PChar('open');
        lpFile := PChar('C:\WINDOWS\system32\calc.exe');
        lpParameters := nil;
        nShow := SW_SHOW;
      end;
      if ShellExecuteEx(@ExecuteInfo) then
        FHandle := ExecuteInfo.hProcess
      else
        FHandle := 0;
    end;
    Et pour fermer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      if FHandle > 0 then
      begin
        TerminateProcess(FHandle, 0);
         FHandle := 0;
      end;
    end;
    Bon cette méthode de fermeture fonctionne, mais elle est peut-être un peu brutale.

    Quelqu'un d'autre pourra peut-être améliorer cette solution.

    @+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 41
    Par défaut
    cool merci !

    peut-etre justement avec Sendmessage ? Maintenant qu'on connait le handle ?...

    genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SendMessage(FHandle,WM_CLOSE,0,0);
    Merci en tout cas ! Je vais essayer ça...

    kioeev

  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
    Une petite remarque: Un SendMessage() ne fonctionnera pas avec la valeur de FHandle, qui est le handle du process et non celui de la fenêtre.

    Néanmoins tu peux essayer de récupérer la Handle de la fenêtre avec FindWindow(nil, "calculatrice"), a voir ...

    @+

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 41
    Par défaut
    yep, j'ai vu ça dans mes recherches
    sauf que le but est qu'un parametre sera justement une application quelconque à lancer ... donc difficille de prévoir le nom de la f'netre !

    merciiiiii !

    kioeev

  6. #6
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 537
    Billets dans le blog
    10
    Par défaut
    Pour terminer le process ça ressemble un peu près à ceci

    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
     
    var
    s1,s2 : smallint ;
    i1 : integer ;
    AppInfo: PAppInfo;
    LW1,LW2,LW3,lw4 : LongWord ;
    begin
    for s1 := 0 to (ListAppliActives.Count-1) do
    begin
    AppInfo := ListAppliActives[s1] ;
    for s2 := 0 to High(ArHFen1) do
    if ArHFen1[s2].IdInfoProcessus = AppInfo.ProcessID then
    BringWindowToTop(ArHFen1[s2].IdHFen) ;
    LW3 := AppInfo.ProcessID ;
    Lw1 := OpenProcess(PROCESS_TERMINATE,false,LW3) ;
    GetExitCodeProcess(lw1,lw2);
    TerminateProcess(lw1,lw2);
    GetExitCodeThread (AppInfo.Thread.Processus, lw4) ;
    TerminateThread (AppInfo.Thread.Processus, lw4) ;
    end ;
    La liste des process est constituée dans une liste par ailleurs

  7. #7
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 537
    Billets dans le blog
    10
    Par défaut
    J'ai la réponse à ta question. Je recherche dans mes programmes


    Citation Envoyé par kioeev
    Hello,

    Alors j'ai une petite interrogation ( je m'y prend surement pas bien )

    Je lance une application externe via :
    ShellExecute(handle,'Open','C:\WINDOWS\system32\calc.exe',nil,nil,SW_SHOWNORMAL);

    Je souahiterai fermer à souhait cette appli depuis delphi
    via par exemple :
    SendMessage(handle,WM_CLOSE,0,0);

    Seulement comment connaitre le handle de l'application lancée par shellexecute ?

    merci d'avance pour toute pistes !

    ciao
    kioeev

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

Discussions similaires

  1. Sendmessage click handle inactif
    Par qiceti dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 07/11/2009, 14h14
  2. SendMessage & Handle de fenêtre et ses champs
    Par darkwall_37 dans le forum Débuter
    Réponses: 37
    Dernier message: 25/06/2009, 09h02
  3. shellexecute ne me prend pas le handle
    Par iris15 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 29/04/2008, 12h22
  4. SendMessage Application Handle
    Par dd16 dans le forum Delphi
    Réponses: 2
    Dernier message: 05/01/2007, 10h40
  5. Réponses: 2
    Dernier message: 12/12/2006, 19h30

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