System.Diagnostics.Process.Start() странное поведение

У меня есть приложение, которое использует Process.Start(string Filename) для открытия файла. Эта перегрузка метода заставит систему вызывать соответствующее приложение на основе расширения имени файла. В моем случае это, как правило, WORD, PPT, PDF, JPG и т. д. Какой-то тип документа для просмотра. В конечном счете, мне нужно запустить процесс, а затем в приложении мне нужно что-то сделать со значением MainWindowHandle.

Я обнаружил по крайней мере три разных случая, которые вызывают Process.Start(string filename) вернуться разными способами...

Для первого и второго случаев ниже предположим, что я открываю два файла .pdf (но то же самое происходит, если я открываю два файла .ppt или два файла .doc как ну)...

Случай 1: Если AcroRd32 не запущен, и я делаю что-то вроде...

Process p = Process.Start("yada.pdf");
p.WaitForInputIdle();
p.Refresh();

, все работает, как и ожидалось. Значение p.MainWindowHandle заполнено правильно. Нет проблем с этим случаем.

Случай 2: Теперь предположим, что во время вызова Process.Start() AcroRd32 уже работает на ранее открытом файле PDF. Теперь все становится странно.Ссылаясь на приведенный ниже код (некоторая логика проверки ошибок удалена для ясности), после вызова в Process.Start() значение p.MainWindowHandle равно нулю (хотя окно создано), а p.MainWindowTitle пуст. Затем я сплю в течение 1 секунды и дескриптор по-прежнему равен нулю, но заголовок главного окна теперь заполнен (даже хотя я НЕ вызывал p.Referesh() после сна. Каждый из операторов трассировки которые имеют "<<<<" в комментариях, печатаются во время выполнения.

Process p = Process.Start("SomeFileName.pdf");
p.WaitForInputIdle();
p.Refresh();
if (p.MainWindowHandle == 0)
    DebugTrace("MainWindowHandle is zero, why??");   //<<<<
if (p.MainWindowTitle.Length == 0)
    DebugTrace("MainWindowTitle is null");           //<<<<
Thread.Sleep(1000);
if (p.MainWindowHandle == 0)
    DebugTrace("MainWindowHandle is still zero.");   //<<<<
if (p.MainWindowTitle.Length == 0)
    DebugTrace("MainWindowTitle is null");
else
    DebugTrace("MainWindowTitle: " + p.MainWindowTitle);  //<<<<

Я уверен, что это как-то связано с тем, что AcroRd32 уже работает, но я не могу это контролировать, и мне нужно получить значение из p.MainWindowHandle. Любые идеи, как справиться с этим?

Случай 3: Затем третий случай: в некоторых случаях Process.Start() возвращает значение null даже если он успешно открывает файл. Я обнаружил, что это имеет место с .jpg, но я уверен, что это зависит только от приложения, которое было присвоено расширение .jpg. Process.Start("file.jpg") возвращает null если приложение «Просмотр фотографий Windows», но если я изменю его на «Краска» не возвращает ноль. Что случилось с этим? И как я могу получить обрабатывать тогда?

Хорошо, все готово, извините за подробности, но, надеюсь, я объясню ситуацию (ситуации). Я пытаюсь пройти!

7
задан Ed. 1 June 2012 в 14:54
поделиться