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 :

Fermer des .exe VB via un autre .exe VB


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mars 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 11
    Par défaut Fermer des .exe VB via un autre .exe VB
    Bonjour !

    D'abord j'aimerais préciser que j'ai recherché dans la FAQ, dans les divers forums sur ce site et ailleurs avant de poster ma question.

    Situation:
    =========
    J'ai un programme VB qui est en fait une fenêtre avec divers boutons, chacun ouvrant une application VB différente. C'est un genre de menu principal. Il est permis d'ouvrir plusieurs applications en même temps via cette fenêtre. J'utilise la fonction Shell() pour ouvrir chaque application.

    Problème:
    ========
    Si je ferme cette fenêtre principale je veux fermer les autres également. Par exemple en demandant : "D'autres applications BLABLABLA sont ouvertes. Voulez-vous les fermer et quitter le système ?" Si "OUI", fermer toutes les applications ainsi que cette fenêtre principale.

    Piste de solution:
    =================
    J'ai essayé la solution proposée dans la FAQ "Comment fermer un programme ouvert avec Shell", jumelée à d'autres infos puisées dans le forum. Je suis capable de trapper le handle d'une applic ouverte (J'essai
    pour une applic... on verra à ajuster pour toutes les applic ouvertes...). Cependant, elle ne ferme pas mais je ne peux plus agrandir la fenêtre qui est dans la barre des tâches. Dans le Gestionnaire des tâches c'est indiqué pour cette application "Pas de réponse..."

    Quelqu'un peut me guider ?


    Merci beaucoup du CANADA !

  2. #2
    Membre expérimenté Avatar de Mandalar
    Profil pro
    Étudiant
    Inscrit en
    Mai 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2004
    Messages : 121
    Par défaut
    Chez moi ce code fonctionne :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
    Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, _
       lpdwprocessid As Long) As Long
    Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, _
       ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, _
       ByVal nIndex As Long) As Long
    Private Const WM_CLOSE = &H10
    Private Const GWL_STYLE = (-16)
     
    Private Function CloseWindow(ByVal hwnd As Long, ByVal hInstance As Long) As Long
     
    Dim idproc As Long
     
    idproc = 0
     
    'reçoit dans idproc l'id du processus lié à cette fenêtre
    GetWindowThreadProcessId hwnd, idproc
    If (idproc = hInstance) And ((GetWindowLong(hwnd, GWL_STYLE) And WS_SYSMENU) = WS_SYSMENU) Then
         PostMessage hwnd, WM_CLOSE, 0, 0
    End If
     
    'obligatoire pour qu'EnumWindows continue l'énumération
    CloseWindow = True
     
    End Function
     
    Public Sub KillApp(hInstance As Long)
     
    EnumWindows AddressOf CloseWindow, hInstance
     
    End Sub
     
     
    Sub main()
     
    Dim a As Double
    a = Shell("C:\Documents and Settings\Compaq_Propriétaire\Bureau\application.exe")
     
    MsgBox ("cliquer pour continuer")
     
    KillApp CLng(a)
     
    End Sub
    C'est le code cité dans la faq (dans un module), et le killapp ferme la fenetre sans afficher ton message ("pas de réponse")
    Je vois pas trop ce qui pourrait géner, est-ce que tes applications n'ont pas un traitement spécial a l'évenement form_unload (ou queryunload) ?

  3. #3
    Membre habitué
    Inscrit en
    Mars 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 11
    Par défaut
    Bonjour Mandalar,

    Sur le Unload des applications il y a une déconnection de la BD. Rien d'autres de spécial. Je vais réessayer et suivre la trace pas à pas et je t'en donne des nouvelles.

    Bonne journée !

  4. #4
    Membre habitué
    Inscrit en
    Mars 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 11
    Par défaut
    Voici où j'en suis rendue:

    Dans mon programme j'ai une feuille, un module Main avec un Sub Main(), un autre module et quelques modules de classes. J'ai mis les déclarations dans le module Main ainsi que le KillApp(...) et le CloseWindow(...). Dans ma feuille j'appelle le KillApp(...)

    J'ai toujours le même problème : mon applic à fermer ne ferme pas comme il faut, elle reste dans le Gestionnaire des tâches avec le statut "Pas de réponse".

    Les applications que je dois fermer via mon application sont très compliquées en fait de gestion de sécurité et connexion BD. Est-ce que le fait de fermer de cette façon, "en catastrophe", peut engendrer des problèmes ? En faisant un CloseWindow(...), est-ce qu'on passe outre une étape comparativement à un Unload() qui ferme plus "politiquement correct" ?

    Je continue mes recherches...

  5. #5
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Normalement, le close windos n'outrepasse pas les evenements unload.

    par contre, j'avais une source dans le style gestionnaire de tâche qui fermais directement le processus (là, il n'y a pas de probleme sauf quand l'apli à plusieurs processus).

    si tu veux, je te l'envoirais.

    contacte moi par mp ou sur mon adresse e-mail.

    salut

  6. #6
    Membre habitué
    Inscrit en
    Mars 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 11
    Par défaut
    Bon... Le code que j'ai fait a l'air de fonctionner mais j'ai remarqué que si je fait la trace et que je stoppe avec un point d'arrêt sur l'instruction PostMessage dans le bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If (idproc = hInstance) And ((GetWindowLong(hwnd, GWL_STYLE) And WS_SYSMENU) = WS_SYSMENU) Then
            PostMessage hwnd, WM_CLOSE, 0, 0
        End If
    qui est dans la fonction CloseWindow(...) l'application demandée ferme. S'il n'y a aucun point d'arrêt et que le code s'exécute sans pause à cet endroit précis, j'ai le problème énuméré plus haut. Est-ce dû au fait que l'application à fermer a besoin d'une réponse via un messagebox (Voulez-vous quitter ? Oui / Non" ??? Si oui, comment puis-je laisser assez de temps, inclure une pause, à cet endroit dans le code ?


    Merci de m'éclairer !


    Gézabel

  7. #7
    Membre habitué
    Inscrit en
    Mars 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 11
    Par défaut
    Bingo !

    J'ai finalement fait une pause tout de suite après l'instruction PostMessage selon le modèle présenté dans la FAQ à la rubrique "Comment faire une pause pendant un temps défini ?"

    Merci beaucoup de vos pistes de solutions !


    Amitiés,

    Gézabel

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 12
    Par défaut
    Salut,
    Pour faire une pause pendant un temps precis, j'utilise ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private declare sub sleep lib "kernel32" (byval dwMilliseconds as long)
     
    'ensuite dans mon code je rajoute
     
    Sleep 2000 'en milliseconde
    J'espere que cela va répondre a ta question de pause.

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

Discussions similaires

  1. .EXE qui lance un autre exe contenu en lui
    Par Argol_Medusa dans le forum C++Builder
    Réponses: 2
    Dernier message: 19/01/2013, 21h28
  2. Blocage d'un exe appelé par un autre exe
    Par fadsys dans le forum PureBasic
    Réponses: 1
    Dernier message: 16/12/2009, 21h55
  3. Lancer un exe à partir d'un autre exe.
    Par kanea_iza dans le forum Windows
    Réponses: 2
    Dernier message: 15/03/2007, 08h34
  4. Gestion de l'exe principal via une(des) DLL(s)
    Par floppy64 dans le forum C++Builder
    Réponses: 5
    Dernier message: 20/01/2007, 23h41
  5. Réponses: 30
    Dernier message: 02/12/2005, 15h30

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