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

Windows Forms Discussion :

Process et ParentProcess


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 59
    Par défaut Process et ParentProcess
    Bonjour,

    Je cherche une solution à mon problème.
    Je voudrais que ma boucle me liste les process avec leur parent, tout ca dans un treeview en gros:

    si mon_process a un parent_process alors mon_process est un subitem du parent_process

    Sachant que mon_process peut etre lui meme parent d'un autre process. J'utilise WMI pour mes boucles, mais depuis plusieurs heures je galère à trouver ma boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim Win32_Process As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_Process")
    For Each queryObj As ManagementObject In Win32_Process.Get()
    'La boucle à trouver ....
    'sachant que 'queryObj("ParentProcessId")' = process_parent de mon_process
    'et que 'queryObj("ProcessId")' = mon_process
    Next
    Si quelqu'un pouvait m'aider à mettre tout cela en forme

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Quelle est la question exactement ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 59
    Par défaut
    Et bien je ne trouve pas la boucle pour contruire mon treeview avec les process en cours et les process parent. Je souhaiterai qu'o m'aide à la faire

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 59
    Par défaut
    J'ai décidé d'utiliser un autre control que le treeview, mais le principe reste le même, j'ai réussi à faire une partie du code mais j'ai un problème à la fin de cette boucle (mis en commentaire dans la source).
    "La collection a été modifiée ; l'opération d'énumération peut ne pas s'exécuter."

    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
            Dim Values As Object()
            Dim Node As TreeListNode
            Dim Node2 As TreeListNode
            Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_Process")
            For Each queryObj As ManagementObject In searcher.Get()
                Dim classInstance As New ManagementObject("root\CIMV2", "Win32_Process.Handle='" & queryObj("Handle") & "'", Nothing)
                Dim outParams As ManagementBaseObject = classInstance.InvokeMethod("GetOwner", Nothing, Nothing)
                If TreeList1.Nodes.Count = 0 Then
                    Values = New Object() {queryObj("Caption"), outParams("User"), queryObj("ExecutablePath"), ConvertirDate(queryObj("CreationDate")), queryObj("ProcessId")}
                    Node2 = TreeList1.AppendNode(Values, -1)
                    Node2.HasAsParent(Node2)
                Else
                    For Each Node In TreeList1.Nodes
                        If Not queryObj("ParentProcessId") = queryObj("ProcessId") Then
                            If queryObj("ParentProcessId") = Node.GetDisplayText(4) Then
                                Values = New Object() {queryObj("Caption"), outParams("User"), queryObj("ExecutablePath"), ConvertirDate(queryObj("CreationDate")), queryObj("ProcessId")}
                                Node2 = TreeList1.AppendNode(Values, Node.Id)
                                Node2.HasChildren = True
                            Else
                                Values = New Object() {queryObj("Caption"), outParams("User"), queryObj("ExecutablePath"), ConvertirDate(queryObj("CreationDate")), queryObj("ProcessId")}
                                Node2 = TreeList1.AppendNode(Values, -1)
                                Node2.HasAsParent(Node2)
                            End If
                        End If
                    Next 'La collection a été modifiée ; l'opération d'énumération peut ne pas s'exécuter.
                End If
            Next

    Je ne vois pas comment eviter l'erreur... Si quelqu'un peut m'éclairer Merci

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 59
    Par défaut
    J'ai trouvé une méthode pas très propre mais fonctionnelle :

    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
                TreeList1.ClearNodes()
                Dim Values As Object()
                Dim ParentPresent As Boolean
                Dim ParentParentPresent As Boolean
                Dim ParentParentParentPresent As Boolean
                Dim ParentId As Integer
                Dim ParentParentId As Integer
                Dim ParentParentParentId As Integer
                Dim Node As TreeListNode
                Dim searcher As New ManagementObjectSearcher("root\CIMV2", "SELECT * FROM Win32_Process")
                For Each queryObj As ManagementObject In searcher.Get()
                    ParentPresent = False
                    ParentParentPresent = False
                    ParentParentParentPresent = False
                    If queryObj("ParentProcessId") = queryObj("ProcessId") Then
                        Dim classInstance As New ManagementObject("root\CIMV2", "Win32_Process.Handle='" & queryObj("Handle") & "'", Nothing)
                        Dim outParams As ManagementBaseObject = classInstance.InvokeMethod("GetOwner", Nothing, Nothing)
                        Values = New Object() {queryObj("Name"), outParams("User"), queryObj("ExecutablePath"), ConvertirDate(queryObj("CreationDate")), queryObj("ProcessId")}
                        Node = TreeList1.AppendNode(Values, -1)
                        TreeList1.ExpandAll()
                    End If
                    For i As Integer = 0 To TreeList1.Nodes.Count - 1
                        If TreeList1.Nodes(i).GetDisplayText(4) = queryObj("ParentProcessId") Then
                            If TreeList1.Nodes(i).GetDisplayText(4) <> queryObj("ProcessId") Then
                                ParentPresent = True
                                ParentId = TreeList1.Nodes(i).Id
                            End If
                        End If
                        For j As Integer = 0 To TreeList1.Nodes(i).Nodes.Count - 1
                            If TreeList1.Nodes(i).Nodes(j).GetDisplayText(4) = queryObj("ParentProcessId") Then
                                If TreeList1.Nodes(i).Nodes(j).GetDisplayText(4) <> queryObj("ProcessId") Then
                                    ParentParentPresent = True
                                    ParentParentId = TreeList1.Nodes(i).Nodes(j).Id
                                End If
                            End If
                            For k As Integer = 0 To TreeList1.Nodes(i).Nodes(j).Nodes.Count - 1
                                If TreeList1.Nodes(i).Nodes(j).Nodes(k).GetDisplayText(4) = queryObj("ParentProcessId") Then
                                    If TreeList1.Nodes(i).Nodes(j).Nodes(k).GetDisplayText(4) <> queryObj("ProcessId") Then
                                        ParentParentParentPresent = True
                                        ParentParentParentId = TreeList1.Nodes(i).Nodes(j).Nodes(k).Id
                                    End If
                                End If
                            Next
                        Next
                    Next
                    If ParentParentParentPresent = True Then
                        Dim classInstance As New ManagementObject("root\CIMV2", "Win32_Process.Handle='" & queryObj("Handle") & "'", Nothing)
                        Dim outParams As ManagementBaseObject = classInstance.InvokeMethod("GetOwner", Nothing, Nothing)
                        Values = New Object() {queryObj("Name"), outParams("User"), queryObj("ExecutablePath"), ConvertirDate(queryObj("CreationDate")), queryObj("ProcessId")}
                        Node = TreeList1.AppendNode(Values, ParentParentParentId)
                        TreeList1.ExpandAll()
                    End If
                    If ParentParentPresent = True Then
                        Dim classInstance As New ManagementObject("root\CIMV2", "Win32_Process.Handle='" & queryObj("Handle") & "'", Nothing)
                        Dim outParams As ManagementBaseObject = classInstance.InvokeMethod("GetOwner", Nothing, Nothing)
                        Values = New Object() {queryObj("Name"), outParams("User"), queryObj("ExecutablePath"), ConvertirDate(queryObj("CreationDate")), queryObj("ProcessId")}
                        Node = TreeList1.AppendNode(Values, ParentParentId)
                        TreeList1.ExpandAll()
                    End If
                    If ParentPresent = True Then
                        Dim classInstance As New ManagementObject("root\CIMV2", "Win32_Process.Handle='" & queryObj("Handle") & "'", Nothing)
                        Dim outParams As ManagementBaseObject = classInstance.InvokeMethod("GetOwner", Nothing, Nothing)
                        Values = New Object() {queryObj("Name"), outParams("User"), queryObj("ExecutablePath"), ConvertirDate(queryObj("CreationDate")), queryObj("ProcessId")}
                        Node = TreeList1.AppendNode(Values, ParentId)
                        TreeList1.ExpandAll()
                    End If
                    If ParentPresent = False Then
                        If ParentParentPresent = False Then
                            If ParentParentParentPresent = False Then
                                If Not queryObj("ProcessId") = 0 Then
                                    Dim classInstance As New ManagementObject("root\CIMV2", "Win32_Process.Handle='" & queryObj("Handle") & "'", Nothing)
                                    Dim outParams As ManagementBaseObject = classInstance.InvokeMethod("GetOwner", Nothing, Nothing)
                                    Values = New Object() {queryObj("Name"), outParams("User"), queryObj("ExecutablePath"), ConvertirDate(queryObj("CreationDate")), queryObj("ProcessId")}
                                    Node = TreeList1.AppendNode(Values, -1)
                                    TreeList1.ExpandAll()
                                End If
                            End If
                        End If
                    End If
                Next

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    For Each sert uniquement à parcourir une collection mais on ne peut pas modifier le contenu de la collection (logique).

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

Discussions similaires

  1. Coment faire du post-processing avec Dx9 ?
    Par rolkA dans le forum DirectX
    Réponses: 23
    Dernier message: 24/11/2003, 21h15
  2. Nom d'un process!!!
    Par Oswald dans le forum C
    Réponses: 12
    Dernier message: 01/09/2003, 15h49
  3. Gestion des process
    Par Oswald dans le forum C
    Réponses: 3
    Dernier message: 29/08/2003, 11h52
  4. Réponses: 4
    Dernier message: 01/07/2003, 15h47
  5. [DOM] Ajout d'une instrution de processing
    Par corwin_d_ambre dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 06/05/2003, 11h51

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