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.