Averigüe si el proceso responde sin usar System.Diagnostics.Process.Responding
Buen día a todos.
Este problema fue parte deotro que como se resolvió, me di cuenta de que lo que pensé que era el problema después de todo, no lo era. Aún así gracias a eso he aprendido un par de cosas.
Mi aplicación trabaja mucho con IE y, de vez en cuando, IE es redirigido a un sitio web con algún código Javascript incorrecto que termina bloqueando la interfaz de IE. Y, en consecuencia, bloquear mi aplicación también una vez que todo en mi aplicación se ejecuta en la mismaThread
.
Para contrarrestar ese problema, al iniciar mi aplicación ejecuta unstatic method
en otroThread
que cada 15 segundos verifica si IE responde o no, y si IE no responde, cierra todos sus procesos, liberando el bloqueo de la aplicación principalThread
y luego mi aplicación puede reanudar su trabajo.
Para saber si los procesos de IE están respondiendo, tenía un código simple 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 elProcess.Responding
la propiedad encuentra si el proceso responde y de acuerdo con la información sobreMSDN, esta propiedad necesita otra propiedad llamadaMainWindowHandle
estar disponible para completar el proceso de verificación. Y siMainWindowHandle
no está disponibleProcess.Responding
siempre devuelve verdadero incluso si el proceso no responde.
Y por alguna razón que no sé. En Windows XPMainWindowHandle
no está disponible allí, asíResponding
no es exacto
Es por eso que necesito saber otra forma de encontrar si un proceso específico responde o no en Windows XP.
Cualquier ayuda es apreciada, gracias.
PD: Si está buscando un sitio web para congelar IE aquí va:http://aboutmycollege.com/
EDITAR: siguiendo la sugerencia 0xA3:
Revisé todos los procesos de IE para verificar si tenían elMainWindowHandle
propiedad, los que tenían esa propiedad les mandoResponding
propiedad de un cuadro de mensaje e informan correctamente cuando IE no responde en Windows 7 pero no en XP.
Ejecuté este código 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());
}
}
}
En Windows 7 y Xp, informa los procesos de IE que no tienen elMainWindowHandle
propiedad, y en Windows 7 también informa correctamente cuando IE no responde. Pero en XP todos los procesos de IE tienenMainWindowHandle
siempre están respondiendo incluso cuando no lo están.