我有一個使用Process.Start(字符串文件名)打開文件的應用程序。此方法重載將導致系統根據文件擴展名調用相應的應用程序。就我而言,它通常是一個WORD,PPT,PDF,JPG等......某種類型的可查看文檔。最終,我需要啓動流程,然後在應用程序中,我需要使用MainWindowHandle值進行操作。System.Diagnostics.Process.Start()奇怪的行爲
我發現至少有三種不同的情況造成的Process.Start(字符串文件名) 返回不同的方式...
對於下面的第一和第二種情況,假設我開了兩個。 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秒 和手柄仍然是零,但mainwindowtitle現在已填充(甚至 雖然我沒有睡眠後調用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()也會返回空值 。我發現這是 .jpg文件的情況,但我相信這取決於分配給.jpg擴展名的 的應用程序。如果應用程序是「Windows照片查看器」,則Process.Start(「file.jpg」)返回空 ,但如果我將其更改爲 「Paint」,它不會返回null。那是怎麼回事?那我怎樣才能得到 的句柄呢?
好的,全部完成,對不起細節,但希望我解釋的情況 我想努力通過!
出於好奇,你需要用MainWindowHandle做什麼?也許有更好的辦法! – banging
我需要跟蹤窗口的位置/大小,並且我正在使用以窗口句柄作爲輸入的GetWindowRect()。由於Process.Start()的限制,我還必須「猜測」活動窗口基於知道文件名和有時知道進程名的基礎。理想情況下,我想不必猜測! :-) –