2012-06-15 55 views
8

我想知道應用程序(不是vb.net)的一個實例是否已經運行 - 因爲我想啓動它,但如果它已經在運行,我不想啓動它。我已經找到了解決,以檢查是否一個進程正在運行:如何獲取在VB.NET中運行的進程名稱列表?

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

和返回真,如果> = 1(或只是過程數)。

我的問題是,這是一個第三方應用程序,它的進程名稱不只是一個名稱,但它包含一個版本號(我可能不知道在運行時),它似乎也添加了* 32(如果安裝在x64中,那麼可能是* 64)。

我需要按名稱獲取正在運行的進程的列表,並測試「processname」是否爲名稱的子字符串。 但我沒有成功獲取名稱列表,只有進程ID。

回答

7

我需要運行的進程的列表,按名稱,並測試「processname」這個名字的子字符串。

你可以使用:

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

這將期待通過所有的進程,而procExists值設置爲true,如果在當前正在執行的過程中存在哪些包含processName任何進程。這應該處理未知版本號的存在以及如果您在64位操作系統上運行(這是WOW64標誌表示它是在64位操作系統上運行的32位進程),則可能會出現*32

+0

我都試過,但 「任何」 不工作。謝謝你解釋* 32。 – Thalia

+0

@emptyheaded只需在您的文件頂部添加「Import System.Linq」,Any應該可以工作。這是一個LINQ擴展方法(http://msdn.microsoft.com/en-us/library/bb534972.aspx) –

+1

@Reed Copsey:它應該不是'p.ProcessName.Contains'而不是p.Name.Contains?我不確定是否。任何情況都是不敏感的。否則,一些額外的.ToUpper將有助於搜索過程名? – PeterCo

6

可以遍歷正在運行的進程是這樣​​的:

For Each p As Process In Process.GetProcesses() 
    Debug.WriteLine(p.ProcessName) 
Next 
2

另一種方式:

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() 
相關問題