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

VB 6 et antérieur Discussion :

Inclure un EXE dans la fenêtre d'un autre EXE


Sujet :

VB 6 et antérieur

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut Inclure un EXE dans la fenêtre d'un autre EXE
    J'ttilise une applcation composée de plusieurs EXE

    Un premier EXE constitue le bureau de travail
    En fonction de l'option que l'on choisit il lance un des autres EXE

    Cela fonctionne bien. Ce que je voudrait c'est de pouvoir définir l'endroit de l'écran auquel s'affiche la FORM du second EXE.
    L'idéal serait de pouvoir l'enfermer dans un panel de l'EXE du bureau de travail
    Je pense qu'il faut passer par le handle de l'application mais je voudrais savoir si qurlqu'un a déjà réalisé cela en VB

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 108
    Points : 109
    Points
    109
    Par défaut
    Pourquoi créer plusieurs EXE ? Il y a les MDIForm pour qu'une Form reste dans une autre ^^.
    Après t'a Form.Top/.Left .

  3. #3
    Expert éminent
    Avatar de ThierryAIM
    Homme Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3 673
    Points : 8 524
    Points
    8 524
    Par défaut
    je suppose que tu lances tes EXE avec un Shell
    Le mieux est peut-etre de définir la position de la fenêtre principale de l'EXE que tu lances dans son Form_Load, non ?
    (ou alors, j'ai pas compris, ou tu t'es mal exprimé)

  4. #4
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 112
    Points : 16 645
    Points
    16 645
    Par défaut
    Salut ThierryAIM
    Je pense que Delphi-ne veut jouer l'exe lancer sur sa propre Form (Form qui serait son burreau personnel), je suis sûr que c'est possible, depuis une petite heure je recherche ou j'ai vu sa, pas moyen de retrouver

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 108
    Points : 109
    Points
    109
    Par défaut
    Tu as une API SetParent, mais je suis pas sûr que ça marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Private Declare Function SetParent Lib "user32"(ByVal hWndChild As Long, ByVal hWndParent As Long) As Long
    Après tu n'a qu'à faire SetParent enfant.hWnd, parent.hWnd .
    Mais comment accéder à la forme sur un autre processus ?!

    J'ai une question, utiliser plein de processus, ça fait ramer l'ordi, non ?
    Intéresse-toi à MDIForm, si tu veux faire un bureau avec des fenêtres, ça t'interessera sûrement ;-) .

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Merci.
    Je connais les fenêtres MDI. Le problème est lié au fait de vouloir lotir le projet en plusieurs morceaux.
    Nous disposons d'une trentaine de produits. Chaque produit représente plusieurs fenêtres et plusieurs modules de calcul. Notre idée est de vouloir réaliser un sous EXE ar produit et de l'appeler depuis un écran principal.
    En MDI nous n'aurions qu'un seul EXE et il serait trop volumineux.
    J'essaie l'API

  7. #7
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    SetParent fonctionne très bien avec un container tel qu'un frame par exemple ;
    tu peux également incorporer des Forms situés dans des ActiveX.

    Sinon, si tu lances avec shell tu dois pouvoir récupérer les coordonnées passés dans la ligne de commande avec Command
    ou avec la structure ShellexecuteInfo si c'est avec shellexecute.

    La solution en Subclassing est certainement la solution la plus agréable à manier
    mais peut initier une légère latence lors de la première instanciation.

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Apparement il y a quelque chose que je n'ai pas compris

    Voilà ce que je fais :
    J'exécute un Shell, je récupère le Handle et je le passe en paramètre de SetParent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        HW = Shell(App.Path + "\" & PC_Ecran & " " & LC_FenetreEnfant, vbNormalFocus)
        Call SetParent(HW, fr_Application.hwnd)
    D'une part cela ne fait rien, mon second EXE continue à vivre sa vie sans être enfermé dans le Frame
    D'autre part
    si tu lances avec shell
    je ne comprends pas comment je pourrais faire autrement

    Merci d'avance

  9. #9
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Shell n'a jamais retourné de handle d'application mais l'id du process
    GetWindowThreadProcessid devrait te permettre de récupérer le handle
    (voir exemple sur allapi)

    Comment faire autrement ?
    Suivant l'inspiration (les solutions sont multiples) mais sont surtout dépendantes de la motivation à intervenir sur la trentaine d'exe existants.

  10. #10
    Membre expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Points : 3 696
    Points
    3 696
    Par défaut
    Je propose d'utiliser mon composant DiConverse6 (voir dans ma signature le lien mes contributions) pour transferer le hWnd a l'application main. Il devient ernsuite facile d'utilise le setparent

  11. #11
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    OK en ce qui concerne le Shell.
    J'ai utilise l'API FindWindow pour déterminer l'handle de l'application lancée

    Pour test si j'écris ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        hWnd = FindWindow(vbNullString, "SousEcran1")
        Call PostMessage(hWnd, WM_CLOSE, 0, 0)
    Cela fonctionne, la fenêtre se ferme bien. Don j'ai récupéré le bon Handle
    Par contre avec le SetParent cela ne fonctionne pas.
    De ce que 'jai vu sur Google cette API semble surtout utilisée pour lier des nouveaux contrôles ou de nouvelles fenêtres.

  12. #12
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Alors je ne m'explique pas - j'ai déjà fait avec des ActiveX sublassés dans des Frames
    et cela fonctionnait tip-top !

  13. #13
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 184
    Points : 619
    Points
    619
    Par défaut
    Je l'ai fait aussi mais sur delphi et je n'avais pas eu de problème
    Bêtement je n'ai pas emmené le code en fin de mission.

    Par contre avant d'en arriver à récupérer le handle de la fenêtre il faut bien que je lance l'EXE par un Shell ?

    Là j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HW = Shell(App.Path + "\" & PC_Ecran , vbNormalFocus)
    Est-ce correct ?

    j'ai déjà fait avec des ActiveX sublassés dans des Frames
    L'autre question que je me pose c'est que dans le cas d'un ActiveX il s'agit d'un objet et non d'un autre EXE.

  14. #14
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 112
    Points : 16 645
    Points
    16 645
    Par défaut
    HW = Shell(App.Path + "\" & PC_Ecran , vbNormalFocus)
    pour eviter toutes confusions App.Path & "\" & PC_Ecran
    Si le schell ne fonctionne pas (message d'erreur eventuellement), vérifier ce que renvois App.Path, curieusement, suivant la plate forme utilisé, il peut être renvoyé avec deja le \, si s'est le cas, la chaine devient "x:\\monexec.exe"

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 108
    Points : 109
    Points
    109
    Par défaut
    Visual Basic fonctionne qu'avec Windows ^^. Je pense que tu veux dire selon l'emplacement ?
    Mets ça à la place du reste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    If Right(App.path,1) = "\" Then
    	Shell(App.path & PC_Ecran, vbNormalFocus)
    Else
    	Shell(App.path & "\" & PC_Ecran, vbNormalFocus)
    End If
     
    HW = FindWindow(vbNullString, "NomFenêtre")
    SetParent HW, Me.hWnd

  16. #16
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Citation Envoyé par ProgElecT
    Salut ThierryAIM
    Je pense que Delphi-ne veut jouer l'exe lancer sur sa propre Form (Form qui serait son burreau personnel), je suis sûr que c'est possible, depuis une petite heure je recherche ou j'ai vu sa, pas moyen de retrouver
    Salut !
    En faisant une pette recherche sur la fonction GetWindowThreadProcessId (tu as ce qu'il faut, je crois...)

Discussions similaires

  1. TimeOut dans l'Automatisation d'un autre EXE
    Par thefutureisnow dans le forum Windows Forms
    Réponses: 0
    Dernier message: 16/01/2012, 18h53
  2. Réponses: 5
    Dernier message: 15/09/2011, 23h53
  3. Application (EXE) dans une fenêtre du front panel
    Par kastillio dans le forum LabVIEW
    Réponses: 3
    Dernier message: 30/11/2009, 16h49
  4. lancer un prgm.exe dans une fenêtre wx
    Par vega95 dans le forum wxPython
    Réponses: 2
    Dernier message: 06/06/2009, 12h16
  5. Un programme dans la fenêtre d'un autre.
    Par ralphi dans le forum C++
    Réponses: 11
    Dernier message: 18/07/2006, 11h52

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