Descubra se o processo está respondendo sem usar System.Diagnostics.Process.Responding

Bom dia a todos.

Esse problema fazia parte deoutro que foi resolvido, percebi que o que eu pensava ser o problema, afinal, não era. Ainda graças a isso eu aprendi algumas coisas.

Meu aplicativo trabalha muito com o IE e, de tempos em tempos, o IE é redirecionado para um site com algum código Javascript incorreto que acaba bloqueando a interface do IE. E, consequentemente, bloqueando meu aplicativo também uma vez que tudo no meu aplicativo está sendo executado no mesmoThread.

Para combater esse problema, na inicialização, meu aplicativo executa umstatic method noutroThread que a cada 15 segundos faz uma verificação simples se o IE está respondendo ou não, e se o IE não está respondendo, ele fecha todos os seus processos, liberando o bloqueio no aplicativo principalThread e então meu aplicativo pode retomar seu trabalho.

Para descobrir se os processos do IE estão respondendo, eu tinha um código simples como este:

bool terminate = false;
foreach (System.Diagnostics.Process exe in System.Diagnostics.Process.GetProcesses())
{
    if (exe.ProcessName.StartsWith("iexplore"))
    {
        if (exe.Responding == false)
        {
            terminate = true;
            break;
        }
    }
}
// Code to close all IE process's...

Para oProcess.Responding propriedade descobre se o processo está respondendo e de acordo com as informaçõesMSDN, essa propriedade precisa de outra propriedade chamadaMainWindowHandle estar disponível para concluir o processo de verificação. E seMainWindowHandle não está disponívelProcess.Responding sempre retorna true mesmo se o processo não estiver respondendo.

E por alguma razão que eu não sei. No Windows XPMainWindowHandle não está disponível lá, entãoResponding não é preciso.

É por isso que preciso conhecer outra maneira de descobrir se um processo específico está respondendo ou não no Windows XP.

Qualquer ajuda é apreciada, obrigado.

PS: Se você está procurando um site para congelar o IE aqui vai:http://aboutmycollege.com/

EDIT: Seguindo sugestão 0xA3:

Passei por todo o processo do IE, verificando se eles tinham oMainWindowHandle propriedade, aqueles que tinham essa propriedade eu envio elesResponding propriedade para uma MessageBox e eles relatam corretamente quando o IE não está respondendo no Windows 7, mas não no XP.

Eu executei esse código a cada 15 segundos:

        foreach (System.Diagnostics.Process exe in System.Diagnostics.Process.GetProcesses())
        {
            if (exe.ProcessName.StartsWith("iexplore"))
            {
                if (exe.MainWindowHandle == IntPtr.Zero)
                {
                    System.Windows.Forms.MessageBox.Show("Process doesn't have MainWindowHandle");
                }
                else
                {
                    System.Windows.Forms.MessageBox.Show("Process Responding: " + exe.Responding.ToString());
                }
            }
        }

No Windows 7 e Xp, ele relata os processos do IE que não possuem oMainWindowHandle e, no Windows 7, ele também relata corretamente quando o IE não está respondendo. Mas no XP todo o processo do IE é comMainWindowHandle estão sempre respondendo mesmo quando não estão.

questionAnswers(1)

yourAnswerToTheQuestion