这个方法肯定不是最好的,查到的资料还有使用进程快照的,但是不知道为什么vs中不能使用进程的结构体PROCESSENTRY32
Public Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Public Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Public Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
以下只是实现了方法而已,优化再考虑。
1.必须是用resume next,否则会弹出当前未运行或者拒绝访问等
On Error Resume Next
processes = System.Diagnostics.Process.GetProcesses()'获取进程列表数组Label1.Text = "进程数量:" + CStr(processes.Length)
For i = 0 To processes.Length - 1
childProcess.proces = processes(i)
childProcess.Name = childProcess.proces.ProcessName'当前进程的名称
childProcess.ID = childProcess.proces.Id'当前进程的PID
childProcess.Path = childProcess.proces.MainModule.FileName.ToString()'当前进程的路径
parentProcess.ID = ParentID(childProcess.proces.ProcessName)’获取父进程PID
parentProcess.proces = Process.GetProcessById(parentProcess.ID)
parentProcess.Name = parentProcess.proces.ProcessName'父进程名称
parentProcess.Path = parentProcess.proces.MainModule.FileName.ToString()'父进程路径
With ListView1'listview显示所有信息
Dim lItem As System.Windows.Forms.ListViewItem = ListView1.Items.Add(childProcess.Name)
With lItem
.SubItems.Add(CStr(childProcess.ID))
.SubItems.Add(childProcess.Path)
.SubItems.Add(parentProcess.Name)
.SubItems.Add(CStr(parentProcess.ID))
.SubItems.Add(parentProcess.Path)
End With
End With
Next
‘获取当前进程的父进程PID
Private Function ParentID(ByVal pn As String) As Integer
Dim parentd As New PerformanceCounter("Process", "Creating Process ID", pn)
Return parentd.NextValue
End Function