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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 115
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 086
    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 ...
    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

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 115
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 086
    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;
    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

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 115
    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 éclairé Avatar de khaled-benloucif
    Inscrit en
    Octobre 2008
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Octobre 2008
    Messages : 74
    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

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