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.NET Discussion :

Problème Processus Dynamiques


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Problème Processus Dynamiques
    Bonjour

    Je cherche a visualiser de instantanément tous les processus liés a une application.

    Par exemple : Google chrome possède 1 ligne dans ma liste de processus mais si je fais dérouler le processus Google il y a 26 sous processus actifs de google chrome actuellement sur mon pc

    J'ai un bout de code qui me retourne uniquement le processus de google chrome affiché a l’écran , mais j'aimerais qu'il me les retourne tous. Avez vous une idée ?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    For Each Processus As Process In Process.GetProcessesByName("Google")
                    ID = Processus.Id.ToString
                    Handle_ = Processus.MainWindowHandle.ToString
                    Title = Processus.MainWindowTitle.ToString
                    Name_ = Processus.ProcessName
                    Etat = Processus.Responding
                    Memory = Processus.PrivateMemorySize64
     
                    ListeHandle2.Add("| Name: " + Name_ + "| ID: " + ID + "| Handle: *" + Handle_ + "*| Title: " + Title)
                Next

  2. #2
    Membre chevronné
    Bonjour,

    Je ne sais si ton objectif est de tuer un process et tous ses sous-process ou bien si tu veux obtenir d'autres infos.

    Je peux seulement t'aider sur la question de "les tuer tous" :

    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
        Private Sub BGo_Click(sender As Object, e As EventArgs) Handles BGo.Click
            Dim Cpt As Integer = 0
            Dim P As System.Diagnostics.Process
            Try
                For Each P In System.Diagnostics.Process.GetProcesses
                    If P.ProcessName.ToUpper Like "*" & TBProcess.Text.ToUpper & "*" Then
                        'P.Kill()
                        MessageBox.Show(P.Id)  ' uniquement pour ce test ...
                        Cpt += 1
                    End If
                Next
            Catch
            End Try
            MessageBox.Show(Cpt & " Process trouvé(s)")
            Me.Close()
            End
        End Sub


    Si je lance ce code à la recherche des process de FireFox, il m'en trouve 6 alors que je n'en vois qu'un dans le gestionnaire des tâches.
    Pour le test, j'ai remplacé le Kill par l'affichage de ID des process (les PID). J'ai ainsi pu vérifier leur concordances avec une autre source d'infos sur les process : TaskList. Ce programme s'exécute en ligne de commande et il conviendrait d'en apprendre davantage à son sujet. Ses résultats pourraient si besoin, être envoyés vers un fichier texte et récupérés dans VB (par un StreamReader). TastKList peut aussi être lancé à partir de VB (par Shell, par exemple).

    L’illustration suivante montre le Gestionnaire des tâches, l'exécution de TaskList et le dernier MessageBox de mon code de Kill des process.

    J’espère que ceci t'aidera ...

  3. #3
    Candidat au Club
    Bonjour

    Et merci de ta réponse

    Mon objectif n'est pas de tuer certain processus, mais d'identifier l'ID d'une application grâce au nom de son processus et de connaitre les Handles de chacune de ses fenêtres ouvertes.

    J'ai modifier mon code en suivant l'exemple que tu m'as donné mais le résultat reste le même.

    Je récupère l'ID et le Handle de la fenêtre uniquement si je clique sur elle, si la fenêtre est caché sous une autre ou si je ne la sélectionne pas mon code ne la vois pas .

    Je poste ci dessous l'ensemble de ma fonction ça sera surement plus simple

    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
     
     
      Sub Check_processus()
            Dim Cpt As Integer = 0
            Dim ListeHandle2 As New List(Of String)
            Dim ListeHandle2_SD As List(Of String)
            Dim Nom_process As String = TextBox1.Text
            Dim P As System.Diagnostics.Process
     
            While avancement <> 170
                Try             
                    For Each P In System.Diagnostics.Process.GetProcesses                 
                        If P.ProcessName.ToUpper Like Nom_process Then
                            Cpt += 1
                            ID = P.Id.ToString
                            Handle_ = P.MainWindowHandle.ToString
                            Title = P.MainWindowTitle.ToString
                            Name_ = P.ProcessName
                            Etat = P.Responding
                            Memory = P.PrivateMemorySize64
                            ListeHandle2.Add("| Name: " + Name_ + "| ID: " + ID + "| Handle: *" + Handle_ + "*| Title: " + Title)
                        End If
                    Next
                Catch
                End Try
     
                ListeHandle2_SD = ListeHandle2.Distinct().ToList
     
                If Me.STOP_Matrice = True Then
                    Me.avancement = 170
                    MessageBox.Show(Cpt & " Process trouvé(s)")
                Else
                    ListBox1.Items.Clear()
                    ListBox2.Items.Clear()
     
                    For Each item In ListeHandle2_SD
                        ListBox2.Items.Add(item)
                    Next
                End If
     
                Application.DoEvents()
                System.Threading.Thread.Sleep(100)
     
            End While
        End Sub

  4. #4
    Membre chevronné
    Bonjour,

    Pour ce qui est de "...'identifier l'ID d'une application grâce au nom de son processus ... ", mon code te donne l'ID de instance principale des autres si elles existent (je me permets de te conseiller des garder la syntaxe If P.ProcessName.ToUpper Like "*" & TBProcess.Text.ToUpper & "*" Then ... car certains programmes peuvent modifier les noms de leurs instances).

    Mais pour ce qui est de "... connaitre les Handles de chacune de ses fenêtres ouvertes", je connais pas.
    Il ne s'agit plus d'instances au sens du système, mais seulement de l'instanciation dynamique d'objets.

    Les instances qu'on retrouve dans le gestionnaire de tâches par exemple, ne correspondent pas forcément à des objets potentiellement visibles par l'utilisateur. Par exemple, en VB, je peux ouvrir Excel et ouvrir une application, et plus tard, lorsque l'utilisateur ferme la fenêtre, je peux fermer l'application dans VB. L'instance d'Excel sera encore présente dans le gestionnaire de tâches et je peux ainsi accumuler pas mal d'instances inutiles. Seule la destruction en VB de l'instance crée en VB me garantit la libération effective de la mémoire.

    Pour ce qui est Handles des fenêtres, je ne crois pas qu'elles soient détectables dans les process du système parce que ce ne sont que des pointeurs vers des instances d'objets (et non d'application), que ces objets soient fenêtres (form) ou Button, ou TextBox, ou n'importe quel objet dont tu as écrit la classe, c'est toujours pareil ...

    Je crois encore, que si un programme est activé plusieurs fois (en même temps), il va se trouver plusieurs fois dans les process du système, mais nous n'y trouverons pas les instances de tous les composants de ces programmes. Mais lorsqu'on lance un programme, celui-ci peut vérifier s'il n'y a déjà pas une instance jumelle de la sienne et décider de se fermer, ou avertir l'utilisateur, ou tuer sa jumelle et prendre sa place, ...

    Ces commentaires n'expriment que mes convictions en la matière, je peux me tromper ...

  5. #5
    Candidat au Club
    merci pour ta réponse, malheureusement je n'ai toujours pas réussi a faire fonctionner mon logiciel comme je le souhaite

    Ma problématique c'est qu j'utilise plusieurs logiciels qui me pop des fenêtre de manière plus ou moins aléatoire sur mes écrans.

    Mon but étant de détecter toutes les fenêtres ouvertes d'un logiciel a un instant t et de pouvoir les réorganiser de manière automatiques

    je sais placer une fenêtre par rapport a un Handle, mais je n'arrive pas a identifier toute les fenêtre ouverte d'un logiciel.

    j'ai pas du partir dans la bonne direction, je me relance sur cette application après quelques mois de break .

    Si vous avez des piste ou des conseil pour m'aider je suis preneur.

  6. #6
    Membre expert
    Bonjour,

    Il faut regarder du côté des API Windows (pinvoke.net) :

    EnumChildWindows

    Cela devrait te mettre sur une piste

    Bon codage++

###raw>template_hook.ano_emploi###