Найти, если процесс отвечает, не используя System.Diagnostics.Process.Responding
Всем добрый день.
Эта проблема была частьюдругой что это было решено, я понял, что то, что я думал, это проблема, в конце концов, это не так. Тем не менее, благодаря этому я узнал пару вещей.
Мое приложение выполняет большую часть работы с IE, и время от времени IE перенаправляется на веб-сайт с некоторым плохим кодом Javascript, который в итоге блокирует интерфейс IE. И, следовательно, блокирование моего приложения, как только все в моем приложении работает на том жеThread
.
Чтобы устранить эту проблему, при запуске мое приложение запускаетstatic method
в другойThread
что каждые 15 секунд выполняется простая проверка, отвечает ли IE или нет, а если IE не отвечает, он закрывает все свои процессы, освобождая блокировку на моем главном приложении.Thread
и тогда мое приложение может возобновить свою работу.
Чтобы узнать, отвечают ли процессы IE, у меня был простой код, подобный этому:
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...
Для того, чтобыProcess.Responding
свойство находит, отвечает ли процесс, и в соответствии с информацией оMSDNдля этого свойства требуется другое свойствоMainWindowHandle
быть доступным для завершения процесса проверки. И еслиMainWindowHandle
не доступноProcess.Responding
всегда возвращает true, даже если процесс не отвечает.
И по какой-то причине, которую я не знаю. В Windows XPMainWindowHandle
там нет такResponding
не точно
Вот почему мне нужно знать другой способ узнать, отвечает ли определенный процесс в Windows XP или нет.
Любая помощь приветствуется, спасибо.
PS: Если вы ищете сайт, чтобы заморозить IE, вот так:http://aboutmycollege.com/
РЕДАКТИРОВАТЬ: После предложения 0xA3:
Я прошел проверку всех процессов IE, если они имелиMainWindowHandle
собственность, те, кто имел эту собственность, я посылаю имResponding
свойство MessageBox, и они сообщают правильно, когда IE не отвечает на Windows 7, но не на XP.
Я выполнял этот код каждые 15 секунд:
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());
}
}
}
В Windows 7 и XP он сообщает о процессах IE, которые не имеютMainWindowHandle
свойство, и в Windows 7 он также правильно сообщает, когда IE не отвечает. Но в XP все процессы IE сMainWindowHandle
всегда отвечают, даже когда они не.