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 :

ShellExecute et application invisible?


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 115
    Points : 70
    Points
    70
    Par défaut ShellExecute et application invisible?
    Bonjour à vous !

    Mon application doit lancer un programme externe lorsqu'elle demarre, pour ceci j'utilise ShellExecute

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShellExecute(Application.Handle,'OPEN','Mon_Programme.exe', Nil, Nil,SW_SHOW);
    Une fois cette application lancée je l'incorpore dans un des composants de mon propre programme. Je désire faire en sorte que cette seconde application soit "invisible" pour l'utilisateur jusqu'à ce qu'elle soit intégrer dans mon composant.

    Ca ne fait pas trés propre de voir deux applications se lancer lorsqu'on en alnce un :S

    J'utilise donc en dernier parametre "SW_HIDE" pour cacher l'application lancé seulement cela n'a pas du tout l'effet souhaité. Que j'utilise Hode ou SHOW le shellExecute se comporte de la même façon, auriez vous une idée?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    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 665
    Points : 25 459
    Points
    25 459
    Par défaut
    J'ai utilise le SW_HIDE avec des programmes consoles surtout, il est vrai de mes souvenirs que lorsque l'on lance une application Delphi, en général, vu que son but principal c'est d'afficher une fenêtre, est n'en a rien à foutre, voir un GetStartupInfo dans le DPR et mettre ShowMainForm à False si wShowWindow est à SW_HIDE ... dans mes applications prévues pour être lancé par un ShellExecute ou CreateProcess, je prévois souvent un mode silencieux par un passage de paramètres ...

  3. #3
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 115
    Points : 70
    Points
    70
    Par défaut
    je ne suis pas sur de comprendre, même en parcourant la doc sur http://social.msdn.microsoft.com

    voici mon code actuel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ShellExecute(Application.Handle,'OPEN','C:\Program Files (x86)\oZone3D\Demoniak3D_FREE_v1.23.0\Demoniak3D.exe', Nil, Nil,SW_SHOW);
     
    (...)
     
    Hand := FindWindow(nil,'Demoniak3D - [Initializing in progress...]');
    Windows.SetParent(hand, Support.Handle);
    L'application que je veux rendre invisble est celle que je lance via mon application principale, je veux la faire apparaitre seulement une fois qu'elle est intégrée a ma propre fiche.

    Actuellement, l'application que je lance apparait quelques secondes puis disparait, lorsque je récupere le handle de sa fiche et que je l'attribut à un de mes composant.

    Je lance l'appli via ShellExecute puis je récupere son handle via findWindow, existe-il dans la même veine un moyen plus propre de récupérer le handle en pramétrant?

    (un petit exemple de paramétrage serait le bienvennu :p)

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    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 665
    Points : 25 459
    Points
    25 459
    Par défaut
    Oh, je te conseille vivement de passer par un CreateProcess, ça sera plus fiable que le FindWindow pour énumérer fenêtre et thread du sous programme (tu peux très bien prendre la fenêtre d'une autre instance que celle que tu as lancé !)

    Comme, je l'ai dit, cela dépend énormément des applications, SW_HIDE fonctionne très bien avec Explorer par exemple, mais certains applications passe outre, ce n'est pas window qui va forcé le HIDE, mais c'est l'application qui est appelé qui doit le gérer !

    Pour cacher le programme appelant, tu dois pouvoir jouer avec SetWindowLong mais pour cela il faut le Handle de l'application (fourni par CreateProcess par exemple) ou un GetWindowThreadProcessId et FindWindow

    Je crois qu'avec l'Handle fourni part FindWindow, tu peux tenter ça, ce fonctionne aussi avec le Handle de l'application, le résultat est globalement le même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure HideFormOnTaskBar(AHandle: THandle);
    begin
      SetWindowLong (AHandle, GWL_EXSTYLE,
                     GetWindowLong (AHandle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW and not WS_EX_APPWINDOW);
    end;

  5. #5
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 115
    Points : 70
    Points
    70
    Par défaut
    Le probleme de Createprocess est que parfois Vista l'ignore à cause des sécurités machin truc...
    La seconde application étant un programme tier que je n'ai pas codé, il m'est donc impossible de parametrer l'affichage ou nom au démarage :S

    (Mais sinon je préfererais utiliser un CreateProcess pour récupérer directement le Handle de la fiche et pouvoir intégrer plus rapidement et sans erreur le sous programme .)

  6. #6
    Membre régulier Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    Points : 77
    Points
    77
    Par défaut
    Tu peux aprés avoir récupéré le Handle de la fiche à masqué et après avoir appelé HideFromTaskBar, appliquer une région nulle sur ta fiche, du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var NewRgn, OldRgn: HRgn;
     
    ...
    NewRgn:= CreateRectRgn(0, 0, 0, 0);
    GetWindowRgn(fHandle, OldRgn);
    SetWindowRgn(fHandle, NewRgn, true);
    ...
    au moment où tu veux la faire apparaître, applique l'ancienne région:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetWindowRgn(fHandle, OldRgn, true);
    où fHandle est le Handle récupéré de la fiche

  7. #7
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 115
    Points : 70
    Points
    70
    Par défaut
    Merci pour cette technique, je ne l'avais pas du tout envisagé! Mais en l'occurence ici le sous programme reste visible de l'utilisateur jusqu'au moment ou le handle est récupéré, aprés quoi le sous programme disparait, donc cela ne change pas vraiment le problème, sauf si je trouve un moyen de récupérer le Handle plus rapidelent qu'avec FindWindow();

  8. #8
    Membre régulier Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    Points : 77
    Points
    77
    Par défaut
    Je crois qu'il faut installer un hook CBT qui doit être logé dans une DLL, j'ai déjà utilisé cette méthode pour désactivé le CTRL+ALT+DEL. voici une portion du code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function CBTHookCallBack(nCode : integer; wParam : WPARAM; lParam : LPARAM) : LRESULT; stdcall;
    begin
     
     Result:= 0;
     
     if (nCode>= HC_ACTION) then
      if nCode= HCBT_CREATEWND then
       if FindWindowEx(0,0,'#32770',Nil)<> 0 then
        Result:= 1;
     
     if Result= 0 then
      Result := CallNextHookEx(Buff^.hCBTMessageHook, nCode, wParam, lParam)
     
    end;
    ici, j'ai utilisé FindWindowEx pour récupéré le handle de la fenêtre du gestionnaire de tâches.

    tu trouve le code complet ici: http://www.phidels.com/php/index.php...ip.php3&id=547

    J'ai une autre version plus stable mais je ne sais pas ou je l'ai mis!

    J'imagine, dés que tu localise la fenetre, tu peux lui appliquer la region nulle ou la faire passer invisible, tout ce fait au moment de la création du processus. l'application n'aura pas le temps de s'afficher.

Discussions similaires

  1. [LV2009] rendre l'application invisible
    Par Super2006 dans le forum LabVIEW
    Réponses: 1
    Dernier message: 11/10/2010, 12h05
  2. fenêtres des applications invisibles
    Par lelutin dans le forum Windows Vista
    Réponses: 2
    Dernier message: 29/11/2007, 19h28
  3. Réponses: 2
    Dernier message: 09/05/2007, 14h30
  4. [WIN32][D7] Application invisible
    Par Herk77 dans le forum Delphi
    Réponses: 8
    Dernier message: 28/10/2006, 22h52
  5. Application invisible et qui écoute le clavier
    Par Belegkarnil dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 12/02/2006, 20h30

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