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

Visual Studio Discussion :

Fermeture de programme en vb


Sujet :

Visual Studio

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Par défaut Fermeture de programme en vb
    Bonjour

    J aimerais fermer un programme tournant sous Windows j avais essayé avec des scripts .bat comme tskill ou taskkill mais a la réouverture du programme il me met comme quoi le programme s est mal arrêté

    Je ne trouve pas les objets et méthodes pour fermer un programme proprement

    Merci de votre aide

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Imports System.Diagnostics
    Imports System.Linq
     
    ...
     
    Dim p = Process.GetProcessesByName("NomDuProcess").FirstOrDefault()
    If p IsNot Nothing Then
        p.CloseMainWindow()
    End If

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Par défaut pb de programme
    bonjour et merci pour votre réponse

    j ai testé ce code sur une application comme "bloc note"
    cela fonctionne

    mais si je teste sur une application comme "wirecast" ( le programme que je cherche à fermer )

    cela ne fonctionne pas !!!

    afin d être sur du bon déroulement j ai modifié le 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
    15
    16
    17
     
    Imports System.Diagnostics
    Imports System.Linq
    Module Module1
     
     
        Sub Main()
            Dim p = Process.GetProcessesByName("wirecast").FirstOrDefault()
            If p IsNot Nothing Then
                p.CloseMainWindow()
            Else
                MsgBox("non trouvé")
     
            End If
        End Sub
     
    End Module
    si j écris mal le nom,---> j ai bien l info comme quoi il ne trouve pas le process
    donc en l écrivant correctement il devrait fermer le programme et pourtant il ne se ferme pas

    avant , j avais essayé avec des commandes de bacth comme "taskkill" cela se ferme mais à la réouverture
    j avais le message comme quoi le programme s est fermé de mauvaise manière


    alors suis parti vers la solution vb mais la je bloque

    je sais aussi qu'un "fin de tache" depuis le gestionnaire Windows ne crée pas d erreur contrairement au "terminer le process"

    si je fais à la réouverture j ai mon message " le programme s est mal fermé ......"


    Avez vous une idée pourquoi le code vb ne ferme pas le programme et cela avec le bon nom ??

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Kill, comme son nom l'indique, ça tue le process, donc forcément il se ferme pas correctement...
    CloseMainWindow, ça ferme la fenêtre principale, donc normalement l'application réagit en se fermant "proprement". Mais ça ne peut fonctionner que s'il y a effectivement une fenêtre principale...

    Comment tu fais normalement pour le fermer manuellement ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Par défaut
    je ferme soit en faisant Fichier - puis quitter
    ou la croix de fermeture de la fenêtre

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Bizarre que ça marche pas alors... Sinon une autre solution est de trouver la fenêtre qui va bien avec FindWindow et de la fermer avec CloseWindow

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Par défaut
    La fenêtre doit être la bonne sinon j aurais le message de la msgbox
    Je ne comprend pas

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par grostaz Voir le message
    La fenêtre doit être la bonne sinon j aurais le message de la msgbox
    Non, Process.GetProcessesByName cherche un processus, pas une fenêtre, donc ça veut juste dire qu'il a trouvé le process. Mais apparemment la fenêtre que tu fermes pour quitter l'appli n'est pas la fenêtre principale, donc CloseMainWindow ne la ferme pas...

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Par défaut
    toujours en recherchant mon code je suis tombé sur des exemples

    j en ai trouvé un qui pourrait aller mais en le testant j ai une erreur :

    L'exception System.AccessViolationException s'est produite
    HResult=-2147467261
    Message=Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
    Source=WindowsApplication1
    StackTrace:
    à WindowsApplication1.Form1.GetWindowThreadProcessId(Int64 hwnd, Int64 lpdwProcessId)
    à WindowsApplication1.Form1.Command2_Click(Object sender, EventArgs e) dans C:\Users\AMOURS\documents\visual studio 2010\Projects\WindowsApplication1\WindowsApplication1\Form1.vb:ligne 55
    InnerException:



    voici le 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
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    Option Explicit On
     
     
    Public Class Form1
     
     
        Private Declare Function WaitForSingleObject Lib "kernel32" _
           (ByVal hHandle As Long, _
           ByVal dwMilliseconds As Long) As Long
     
        Private Declare Function FindWindow Lib "user32" _
           Alias "FindWindowA" _
           (ByVal lpClassName As String, _
           ByVal lpWindowName As String) 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 IsWindow Lib "user32" _
           (ByVal hwnd As Long) As Long
     
        Private Declare Function OpenProcess Lib "kernel32" _
           (ByVal dwDesiredAccess As Long, _
           ByVal bInheritHandle As Long, _
           ByVal dwProcessId As Long) As Long
     
        Private Declare Function GetWindowThreadProcessId Lib "user32" _
           (ByVal hwnd As Long, _
           ByVal lpdwProcessId As Long) As Long
     
        'Constants that are used by the API'
        Const WM_CLOSE = &H10
        Const INFINITE = &HFFFFFFFF
        Const SYNCHRONIZE = &H100000
        Private Sub Command1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Command1.Click
            Shell("calc.exe", vbNormalNoFocus)
        End Sub
     
     
        Private Sub Command2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Command2.Click
            Dim hWindow As Long
            Dim hThread As Long
            Dim hProcess As Long
            Dim lProcessId As Long
            Dim lngResult As Long
            Dim lngReturnValue As Long
     
            hWindow = FindWindow(vbNullString, "calculatrice")
            hThread = GetWindowThreadProcessId(hWindow, lProcessId)
     
     
            hProcess = OpenProcess(SYNCHRONIZE, 0&, lProcessId)
            lngReturnValue = PostMessage(hWindow, WM_CLOSE, 0&, 0&)
            lngResult = WaitForSingleObject(hProcess, INFINITE)
     
            'Does the handle still exist?'
            'DoEvents()'
            hWindow = FindWindow(vbNullString, "calculatrice")
            If IsWindow(hWindow) = 1 Then
                'The handle still exists. Use the TerminateProcess function'
                'to close all related processes to this handle. See the'
                'article for more information.'
                MsgBox("Handle still exists.")
     
            Else
                'Handle does not exist.'
                MsgBox("All Program Instances Closed.")
            End If
        End Sub
     
     
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
        End Sub
     
     
    End Class
    ce test est fait avec le programme calculatrice de Windows
    je me dis que si cela fonctionne pour la calculatrice après je change le nom et cela ira mais je ne comprend pas l erreur d accès !!


    une idée ?

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Par défaut
    bonsoir je continu mes recherches
    le problème d accès mémoire venait que calculatrice est dans le system Windows
    en fermant un autre programme je n ai plus cette erreur

    mais mon programme "wirecast " ne se ferme toujours pas
    la fonction de FindWindow et d envoi de fermeture ne fonctionne toujour pas

    snif un peu d aide?

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Par défaut
    après beaucoup de recherche
    j ai essayé de faire un " terminateprocess()"

    cela ne fonctionne toujours pas

    je me demande si l application n est pas "protégé "
    car pour utiliser cette fonction il est dit :

    The handle must have the PROCESS_TERMINATE access right. For more information, see Process Security and Access Rights.

    qu en pensez vous?

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/11/2006, 23h39
  2. Fermeture de programme
    Par janego dans le forum C++Builder
    Réponses: 2
    Dernier message: 31/07/2006, 19h06
  3. Fermeture du programme
    Par oasis_5 dans le forum Général Python
    Réponses: 11
    Dernier message: 08/03/2006, 11h28
  4. [c++] Plantage à la fermeture du programme
    Par Asmodean dans le forum C++
    Réponses: 5
    Dernier message: 21/02/2006, 13h20
  5. Réponses: 7
    Dernier message: 24/01/2005, 11h36

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