Как я могу восстановить ссылку на процесс, который был перезапущен? - PullRequest
1 голос
/ 05 августа 2009

Используя Process.Start, я запускаю различные процессы IE8 и Firefox (3.5), для которых я сохраняю экземпляр Process.

Чуть позже в приложении я буду использовать свойство MainWindowHandle экземпляров Process, чтобы настроить окно для использования с некоторыми функциями API платформы через P / Invoke.

Однако и IE8, и Firefox убьют второй процесс, который я запускаю, а затем перезапустите его, используя первый. Это означает, что мой экземпляр Process теперь ссылается на закрытый процесс, поэтому HasExited имеет значение true, а MainWindowHandle равен IntPtr.Zero.

Вот пример того, что происходит (я использую IE8 для этого примера):

  • Process.Start вызывается с помощью «iexplore.exe»
  • Процесс запускается и продолжает работать
  • Process.Start вызывается снова с «iexplore.exe»
  • Первый процесс продолжает работать, но второй немедленно прекращается
  • Запущен другой процесс iexplore (предположительно, первым процессом iexplore).
  • В течение этого времени пользователь видит второе окно IE только после того, как второй процесс завершен и перезапущен.

Я понимаю, почему эти браузеры ведут себя так, но это создает для меня проблему, если я хочу позже контролировать созданный процесс.

Кто-нибудь сталкивался с этой проблемой раньше? Как бы вы порекомендовали получить ссылку на процесс обратно? Я думал об использовании GetProcessesByName и итерации по заголовкам их окон, но, к сожалению, заголовки могут совпадать с первым запущенным процессом.

Примечание: IE8 была первой версией IE, которая использовала разделение процессов, и поэтому только IE8 ведет себя таким образом, у меня нет этой проблемы с IE7, к сожалению, мне также нужна поддержка IE8.

1 Ответ

0 голосов
/ 05 августа 2009

В прошлом я использовал таблицу бегущих объектов (ROT), чтобы найти конкретный процесс и управлять им.

http://www.codeproject.com/KB/COM/ROTStuff.aspx

...