Спасибо за ответы. Это
_process.Start();
_process.WaitForInputIdle();
Кажется, чтобы решить проблему. Это все еще странно, потому что Responding и WaitForInputIdle должны использовать один и тот же вызов Win32 API под прикрытием.
Дополнительная информация
Приложения с графическим интерфейсом имеют главное окно с очередью сообщений. Responding и WaitForInputIdle работают, проверяя, обрабатывает ли процесс сообщения из этой очереди сообщений. Вот почему они работают только с приложениями с графическим интерфейсом. Почему-то кажется, что слишком быстрый вызов Responding мешает получению Process получения дескриптора этой очереди сообщений. Вызов WaitForInputIdle, похоже, решает эту проблему.
Мне придется погрузиться в отражатель, чтобы понять, смогу ли я понять это.
обновление
Кажется, что получение дескриптора окна, связанного с процессом, сразу после запуска, достаточно для запуска странного поведения. Как это:
_process.Start();
IntPtr mainWindow = _process.MainWindowHandle;
Я проверил с помощью Reflector, и именно это делает Responding под одеялом. Кажется, что если вы получаете MainWindowHandle слишком рано, вы получите неправильный, и он использует этот неправильный дескриптор его до конца жизни процесса или пока вы не вызовете Refresh ();
обновление
Вызов WaitForInputIdle () решает проблему только иногда. Вызов Refresh () каждый раз, когда вы читаете свойство Responding, кажется, работает лучше.