2012-06-15 8 views
8

Sto cercando di scoprire se un'istanza di un'applicazione (non vb.net) è già in esecuzione, perché vorrò avviarla ma non voglio avviarla se è già in esecuzione. Ho trovato una soluzione per controllare se un processo è in esecuzione:Come si ottiene l'elenco dei nomi dei processi in esecuzione, in VB.NET?

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

e restituire True se> = 1 (o semplicemente il numero di processo).

Il mio problema è, questa è un'applicazione di terze parti, e il suo nome di processo non è solo un nome ma contiene un numero di versione (che potrei non sapere in fase di esecuzione), e sembra anche aggiungere un * 32 (quindi probabilmente un * 64 se è installato in x64?).

Ho bisogno di ottenere un elenco di processi in esecuzione, per nome, e verificare se "processname" è una sottostringa del nome. Ma non sono riuscito a ottenere un elenco di nomi, solo gli ID di processo.

risposta

7

Ho bisogno di ottenere un elenco dei processi in esecuzione, per nome, e verificare se "processname" è una sottostringa del nome.

Si potrebbe utilizzare:

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

Ciò guardare attraverso tutti i processi, e impostare il valore su True procExists eventuale processo che contieneprocessName esiste nei processi attualmente in esecuzione. Questo dovrebbe gestire l'esistenza del numero di versione sconosciuto e dello *32 che potrebbe verificarsi se stai usando un sistema operativo a 64 bit (questo è il flag WOW64 che dice che è un processo a 32 bit in esecuzione su un sistema operativo a 64 bit).

+0

Ho provato questo ma "Qualsiasi" non funziona. Grazie per aver spiegato il * 32. – Thalia

+0

@emptyheaded Basta aggiungere "Import System.Linq" nella parte superiore del file, e Any dovrebbe funzionare. È un metodo di estensione LINQ (http://msdn.microsoft.com/en-us/library/bb534972.aspx) –

+1

@Reed Copsey: non dovrebbe essere "p.ProcessName.Contains" anziché p.Name.Contains? E non sono sicuro se. Qualunque sia il caseintensitivo. Altrimenti, qualche altro .ToUpper potrebbe essere utile per cercare il processname? – PeterCo

6

è possibile scorrere i processi in esecuzione in questo modo:

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

un altro modo:

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() 
Problemi correlati