DekGenius.com
[ Team LiB ] Previous Section Next Section

Recipe 6.6 Determining Whether a Process Has Stopped Responding

Problem

You need to watch one or more processes to determine whether they have stopped responding to the system. This functionality is similar to the column in the Task Manager that displays the text Responding or Not Responding, depending on the state of the application.

Solution

Use the following method to determine whether a process has stopped responding:

public bool IsProcessResponding(Process process)
{
    if (process.MainWindowHandle == IntPtr.Zero)
    {
        Console.WriteLine("This process does not have a MainWindowHandle");
        return (true);
    }
    else
    {
        // This process has a MainWindowHandle
        if (!process.Responding)
        {
            Console.WriteLine("Process " + process.ProcessName + 
              " is not responding.");
            return (false);
        }
        else
        {
            Console.WriteLine("Process " + process.ProcessName + 
              " is responding.");
            return (true);
        }
    }
}

Discussion

The IsProcessResponding method accepts a single parameter, process, identifying a process. The Responding property is then called on the Process object represented by the process parameter. This property returns a true to indicate that a process is currently responding, or a false to indicate that the process has stopped responding.

The Responding property always returns true if the process in question does not have a MainWindowHandle. Processes such as Idle, spoolsv, Rundll32, and svchost do not have a main window handle and therefore the Responding property always returns true for them. To weed out these processes, you can use the MainWindowHandle property of the Process class, which returns the handle of the main window for a process. If this property returns zero, the process has no main window.

To determine whether all processes on a machine are responding, you can call the IsProcessResponding method as follows:

foreach (Process proc in Process.GetProcesses( ))
{
    if (!MyObject.IsProcessResponding(proc))
    {
        Console.WriteLine("Process " + proc.ProcessName + " is not responding.");
    }
}

This code snippet iterates over all processes currently running on your system. The static GetProcesses method of the Process class takes no parameters and returns an array of Process objects that contains process information for all processes running on your system. Each Process object is then passed in to our IsProcessResponding method to determine whether it is responding. Other static methods on the Process class that retrieve Process objects are GetProcessById, GetCurrentProcess, and GetProcessesByName.

See Also

See the "Process Class" topic in the MSDN documentation.

    [ Team LiB ] Previous Section Next Section