2016-08-31 12 views
-3

Я пытаюсь запустить процесс из своего приложения WPF. Этот процесс также является приложением WPF, разработанным с использованием инфраструктуры PRISM/MEF.WaitforInputIdle не работает должным образом

var process = Process.Start(processPath); 
process.WaitForInputIdle(); 
Console.WriteLine(process.MainWindowHandle); 

//rest of the code 

Проблема с PRISM/MEF применения в качестве процесса WaitForInputIdle() не work.I пытался печати MainWindowHandle и его нуль после WaitForInputIdle().

Принимая во внимание, что я пытался открыть другой процесс, например notepad.exe, WaitForInputIdle() работает и печатает дескриптор окна.

Теперь я использую это обходное решение, но может ли кто-нибудь сказать, почему WaitForInputIdle() работает неправильно?

var process = Process.Start(processPath); 
process.WaitForInputIdle(); 
Console.WriteLine(process.MainWindowHandle) 

while (process.MainWindowHandle == IntPtr.Zero) 
     { 
       Thread.Sleep(10); 
     } 
//rest of the code 
+0

Возможный дубликат [WaitForInputIdle не работает при запуске программы mspaint программно] (http://stackoverflow.com/questions/33405201/waitforinputidle-doesnt-work-for-starting-mspaint-programmatically) – IInspectable

ответ

0

Process.WaitForInputIdle() method просто ждет цикл сообщений текущего процесса, чтобы войти в состояние ожидания. Подобно вашему циклу WaitForInputIdle() также является обходным путем, он не предназначен специально для ожидания создания MainWindowHandle. Поэтому в зависимости от того, как работает приложение, нет гарантии, что дескриптор окна был создан к моменту возвращения метода.

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

WPF, Prism и MEF работают немного иначе, чем WinForms, поэтому нет никакой гарантии, что дескриптор окна был создан, когда приложение, наконец, войдет в незанятое состояние. К сожалению, я не очень люблю WPF, Prism или MEF, поэтому я даже не могу представить теорию об этом поведении.

+1

Обратите внимание, что в частности , если процесс попадает на какой-то COM-запрос и начинает обрабатывать сообщения, Windows будет рассматривать это так, как если бы он достиг «входа в режим ожидания». По крайней мере, это один из самых распространенных сценариев, когда это происходит. WPF на самом деле не работает совсем иначе, чем Winforms; Я бы не ожидал увидеть, что программа WPF достигает ввода бездействия до того, как будет создано его основное окно, за исключением случаев, когда такая же программа реализована как Winforms. То есть оба вызывали бы что-то еще, что обманывало Windows; это не то, что может вызвать обычный шаблон API. –

+0

@PeterDuniho: Спасибо за ваш комментарий. Как я уже говорил, я не очень хорошо разбираюсь в том, как работает WPF/Prism/MEF, поэтому я действительно не знаю, как он создает свои окна и что он делает в своем цикле сообщений. –

+0

Вам не хватает важной информации: 'WaitForInputIdle' ждет максимум один раз за процесс и возвращается, как только поток готов обрабатывать сообщения (** любой ** поток). В зависимости от вашей конкретной установки система будет создавать (или внедрять) потоки в каждый процесс, поэтому любой процесс может иметь потоки, готовые обрабатывать сообщения в любой момент, независимо от используемой платформы или фреймворка. 'WaitForInputIdle' был изобретен для DDE. Использование его для чего-либо еще является ошибкой (и использование DDE - возможно - ошибка). – IInspectable

Смежные вопросы