我试图在DataGridView中列出所有进程。
当我对前两行进行调暗并读取总进程数时,它可能是一个类似于191个进程的数字。但是,添加每个进程的循环最终会得到一个数字,通常是总数的一半左右?我想也许可能存在某种隐藏的逻辑,其中重复项没有被添加,但是一旦完成,一些重复项就会被添加到列表中。
有人能指出所有流程都没有被添加到列表中的原因吗?
以下是代码:
Dim intProcessesCount As Integer = Process.GetProcesses.Count
Dim localAll As Process() = Process.GetProcesses()
Try
For Each OneProcess As Process In localAll
' Extract the program's icon
Dim ico As Icon = Icon.ExtractAssociatedIcon(OneProcess.MainModule.FileName)
Dim pID = OneProcess.Id.ToString
imgID = pID
ImageList1.Images.Add(pID, ico)
Dim row As String() = New String() { _
OneProcess.ProcessName, _
OneProcess.MainModule.FileVersionInfo.FileName}
DataGridView1.Rows.Add(row)
Next
Catch ex As Exception
Debug.Print("Error: " & ex.Message)
End Try
ttslStats.Text = "Total Processes: " & DataGridView1.Rows.Count
答案 0 :(得分:0)
您在输出窗口中看到的异常会导致for
循环中断,因为try/catch
会封闭整个for
循环。因此,您只能获得localAll
之前出现导致异常的流程。
如果你在循环中移动try/catch
,它会继续通过localAll
,所以你应该得到原始数字减去例外数量:
For Each OneProcess As Process In localAll
Try
' Extract the program's icon
Dim ico As Icon = Icon.ExtractAssociatedIcon(OneProcess.MainModule.FileName)
Dim pID = OneProcess.Id.ToString
imgID = pID
ImageList1.Images.Add(pID, ico)
Dim row As String() = New String() { _
OneProcess.ProcessName, _
OneProcess.MainModule.FileVersionInfo.FileName}
DataGridView1.Rows.Add(row)
Catch ex As Exception
Debug.Print("Error: " & ex.Message)
End Try
Next
此外,每次调用GetProcesses()
时,您都会获得一个新的进程列表,因此如果启动了任何新进程或某些现有进程已退出,则第二个调用可能会返回不同数量的进程。两个电话。
您应该拨打GetProcesses()
一次,立即将结果分配给localAll
,然后使用它来计算:
Dim localAll As Process() = Process.GetProcesses()
Dim intProcessesCount As Integer = localAll.Count