How do I detect if a process is already running under the Windows Task Manager? I'd like to get the memory and cpu usage as well.
6 Answers
Simple example...
bool processIsRunning(string process)
{
return (System.Diagnostics.Process.GetProcessesByName(process).Length != 0);
}
Oops... forgot the mem usage, etc...
bool processIsRunning(string process)
{
System.Diagnostics.Process[] processes =
System.Diagnostics.Process.GetProcessesByName(process);
foreach (System.Diagnostics.Process proc in processes)
{
Console.WriteLine("Current physical memory : " + proc.WorkingSet64.ToString());
Console.WriteLine("Total processor time : " + proc.TotalProcessorTime.ToString());
Console.WriteLine("Virtual memory size : " + proc.VirtualMemorySize64.ToString());
}
return (processes.Length != 0);
}
(I'll leave the mechanics of getting the data out of the method to you - it's 17:15 here, and I'm ready to go home. :)
- 28,629
- 10
- 64
- 112
Have you looked into the System.Diagnostics.Process Class.
- 22,563
- 6
- 34
- 49
- 5,326
- 1
- 21
- 36
You can use System.Diagnostics.Process Class.
There is a GetProcesses() and a GetProcessesByName() method that will get a list of all the existing processes in an array.
The Process
object has all the information you need to detect if a process is running.
- 22,563
- 6
- 34
- 49
- 2,470
- 5
- 19
- 19
If you wanted to find out about the IE Processes that are running:
System.Diagnostics.Process[] ieProcs = Process.GetProcessesByName("IEXPLORE");
if (ieProcs.Length > 0)
{
foreach (System.Diagnostics.Process p in ieProcs)
{
String virtualMem = p.VirtualMemorySize64.ToString();
String physicalMem = p.WorkingSet64.ToString();
String cpu = p.TotalProcessorTime.ToString();
}
}
- 9,622
- 4
- 64
- 65
- 722
- 1
- 8
- 17
You could use WMI to query something along the lines of
"SELECT * FROM Win32_Process WHERE Name = '<your process name here>'"
Especially processor usage is a bit tricky with WMI, though. You are probably better off with System.Diagnostics.Process, as Ian Jacobs suggested.
Something like this:
foreach ( WindowsProcess in Process.GetProcesses)
{
if (WindowsProcess.ProcessName == nameOfProcess) {
Console.WriteLine(WindowsProcess.WorkingSet64.ToString);
Console.WriteLine(WindowsProcess.UserProcessorTime.ToString);
Console.WriteLine(WindowsProcess.TotalProcessorTime.ToString);
}
}