如何在VB.NET中获取正在运行的进程名称列表?

9

我正在尝试找出一个应用程序实例(不是vb.net),是否已经在运行 - 因为我希望启动它,但如果它已经在运行,我就不想再次启动它。我已经找到了一种解决方案来检查进程是否正在运行。

Dim proc As Integer = Process.GetProcessesByName(ProcessName).GetUpperBound(0) + 1 

如果>=1(或进程号)返回True。

我的问题是,这是一个第三方应用程序,它的进程名称不仅仅是一个名称,而是包含版本号(我可能在运行时不知道),并且似乎还添加了*32(所以如果它安装在x64中,则可能为*64)。

我需要按名称获取正在运行的进程列表,并测试"processname"是否是名称的子字符串。但我没有成功地获取名称列表,只有进程ID。

4个回答

8
我需要获取正在运行的进程列表,按名称分类,并测试“processname”是否为名称的子字符串。

您可以使用以下方法:

Dim procExists as Boolean = Process.GetProcesses().Any(Function(p) p.Name.Contains(processName))

这将查找所有进程,并在当前正在执行的进程中存在包含processName的任何进程时,将procExists值设置为True。 这应该处理未知版本号的存在以及在64位操作系统上运行时可能出现的*32(这是WOW64标志,表示在64位操作系统上运行的32位进程)。


我已经尝试过这个,但是“Any”不起作用。谢谢您解释*32。 - Thalia
@emptyheaded 只需在文件顶部添加 "Import System.Linq",Any 就可以工作了。这是一个 LINQ 扩展方法(http://msdn.microsoft.com/en-us/library/bb534972.aspx)。 - Reed Copsey
2
@Reed Copsey:难道不应该是'p.ProcessName.Contains'而不是'p.Name.Contains'吗?我不确定.Any是否大小写不敏感。否则,一些额外的.ToUpper会有助于搜索进程名称? - PeterCo

7
您可以按如下方式遍历正在运行的进程:
For Each p As Process In Process.GetProcesses()
   Debug.WriteLine(p.ProcessName)
Next

3
另一种方法:
    Dim psList() As Process
    Try
        psList = Process.GetProcesses()

        For Each p As Process In psList
            Console.WriteLine(p.Id.ToString() + " " + p.ProcessName)
        Next p

    Catch ex As Exception
        Console.WriteLine(ex.Message)
    End Try
    Console.ReadKey()

0

刚刚尝试了Reed Copesy发布的答案,但似乎已经改变了,对我有效的是:

Dim procExists as Boolean = Process.GetProcesses().Any(Function(p) p.ProcessName.Contains(processName))

也可以通过名称检索数组,并直接验证它是否包含在进程数组中。
Process.GetProcessesByName(processName).Length > 0

谢谢!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接