You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET获取指定进程线程并显示至ListView的问题求助

解决VB.NET中进程线程信息显示的类型转换错误

你碰到的Unable to cast object of type System.Diagnostics.ProcessThread to type System.Diagnostics.Process错误,核心原因很明确——循环变量的类型声明错了,同时代码还存在两个关键逻辑问题:没有使用用户输入的目标进程,而是默认取了当前程序的进程;线程启动时间的获取可能抛出未处理的异常。

关键修改点拆解

  • 修正循环变量类型:ProcessThreadCollection里的元素是ProcessThread对象,不是Process,所以循环变量必须声明为Dim thread As ProcessThread。
  • 切换到目标进程:原来的代码用了Process.GetCurrentProcess(),这只会获取当前窗体程序的线程,完全偏离了用户输入进程的需求,需要替换成用户指定的进程对象,还要处理找不到对应进程的情况。
  • 安全获取线程启动时间:部分系统线程可能无法访问StartTime属性,必须加异常捕获避免程序崩溃。

修正后的完整代码

Imports System.Diagnostics
Imports System.Threading
Imports System.Windows.Forms
Imports System.ComponentModel

Public Class Form1
    Private Sub ListThreads()
        Try
            ' 获取用户输入的进程,先去掉首尾空格避免匹配失败
            Dim targetProcesses As Process() = Process.GetProcessesByName(txtprocessName.Text.Trim())
            
            ' 判断是否找到对应进程
            If targetProcesses.Length = 0 Then
                MessageBox.Show($"未找到名为「{txtprocessName.Text}」的进程", "提示")
                Return
            End If
            
            ' 取第一个匹配的进程(如果有多个同名进程,可扩展为遍历所有进程)
            Dim targetProcess As Process = targetProcesses(0)
            Dim processThreads As ProcessThreadCollection = targetProcess.Threads
            
            threadList.BeginUpdate()
            threadList.Clear()
            
            ' 设置ListView列(如果窗体设计时已添加列,可删除这段)
            threadList.Columns.Add("线程ID", 60, HorizontalAlignment.Left)
            threadList.Columns.Add("优先级", 60, HorizontalAlignment.Right)
            threadList.Columns.Add("启动时间", 120, HorizontalAlignment.Right)
            
            ' 遍历线程集合,注意变量类型为ProcessThread
            For Each thread As ProcessThread In processThreads
                Dim lvi As New ListViewItem()
                lvi.Text = thread.Id.ToString() ' 第一列直接显示线程ID
                lvi.SubItems.Add(thread.BasePriority.ToString())
                
                ' 安全获取启动时间,捕获无法访问的异常
                Dim startTimeStr As String
                Try
                    startTimeStr = thread.StartTime.ToString("yyyy-MM-dd HH:mm:ss")
                Catch ex As Exception
                    startTimeStr = "无法获取"
                End Try
                lvi.SubItems.Add(startTimeStr)
                
                threadList.Items.Add(lvi)
            Next thread
            
            threadList.EndUpdate()
        Catch e As Exception
            MessageBox.Show($"发生错误:{e.Message}", "错误提示")
        End Try
    End Sub

    Private Sub btnShow_Click(sender As Object, e As EventArgs) Handles btnShow.Click
        ListThreads()
    End Sub
End Class

额外提示

  1. 如果系统存在多个同名进程(比如多开的浏览器进程),当前代码只取第一个匹配项,你可以根据需求扩展为遍历所有匹配进程的线程。
  2. 建议在窗体设计阶段预先配置ListView的列,这样代码中可以去掉Columns.Add的部分,让逻辑更简洁。
  3. 线程的BasePriority是进程优先级加上线程优先级偏移后的结果,如果你需要显示原始的线程优先级,可以改用thread.PriorityLevel。

内容的提问来源于stack exchange,提问作者Muhammad Sameem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:59:19