2013-02-13 47 views
2

我正在嘗試編寫一個程序,該程序只需單擊一次即可打開多個文檔,併爲每個單獨的文檔窗口指定大小和位置。在我嘗試打開第二個Word或Excel文檔之前,我已經獲得了一個基本程序的體面成功,用於測試開放和定位操作。用Process.Start打開多個文檔()

using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     [DllImport("user32.dll", SetLastError = true)] 
     internal static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); 

     static void Main(string[] args) 
     { 
      Process resize = new Process(); 

      resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\TEST1.txt"; 
      resize.Start(); 
      resize.WaitForInputIdle(); 
      MoveWindow(resize.MainWindowHandle, 10, 10, 500, 500, true); 

      resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\MSWTEST1.docx"; 
      resize.Start(); 
      resize.WaitForInputIdle(); 
      MoveWindow(resize.MainWindowHandle, 20, 20, 500, 500, true); 

      resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\MSXTEST1.xlsx"; 
      resize.Start(); 
      resize.WaitForInputIdle(); 
      MoveWindow(resize.MainWindowHandle, 30, 30, 500, 500, true); 

      resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\TEST2.txt"; 
      resize.Start(); 
      resize.WaitForInputIdle(); 
      MoveWindow(resize.MainWindowHandle, 40, 40, 500, 500, true); 

      resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\MSWTEST2.docx"; 
      resize.Start(); 
      resize.WaitForInputIdle(); 
      MoveWindow(resize.MainWindowHandle, 50, 50, 500, 500, true); 

      resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\MSXTEST2.xlsx"; 
      resize.Start(); 
      resize.WaitForInputIdle(); 
      MoveWindow(resize.MainWindowHandle, 60, 60, 500, 500, true); 
     } 
    } 
} 

該程序試圖打開使用記事本2個.txt文件,使用的MSWord 2個的.docx文件,並使用msexcel的2個的.xlsx文件。無論我在程序中打開文檔的順序如何,在打開第二個Word或Excel文件後立即在WaitForInputIdle行上引發InvalidOperationException。任何幫助解決這個錯誤將不勝感激。

+1

如果您不重複使用'resize',即每個都有不同的'Process',是否會出現同樣的問題? – 2013-02-13 17:28:19

+2

爲什麼要在同一個進程(調整大小)中啓動()多個文檔? – Paparazzi 2013-02-13 17:29:05

+0

@奧斯汀 - 是的,我使用1個進程還是6個進程會出現同樣的問題。 – 2013-02-13 17:37:27

回答

4

當您嘗試打開W​​ord或Excel文檔時,正在執行的應用程序(取決於版本)只會查找已運行的相同應用程序,要求它打開一個新的「窗口」並關閉。這意味着你實際運行從來沒有真正得到一個消息泵的應用 - 這會導致WaitForInputIdle異常觸發的InvalidOperationException(如documented

我建議你只是試圖捕捉和忽略例外 - 我不知道有什麼方法可以辨別的Word/Excel中通過Process.Start 更新成功打開文件:從概念上講,如果你得到這意味着字/ Excel中發現了另一個正在運行的實例,並切換到它的例外 - 所以,想必這就是某種程度的「成功」。

+0

非常感謝您的回答。解釋它爲什麼會發生以及如何處理它。我無法調高,所以我只會給它+1。 – 2013-02-13 18:03:13

3

當您打開第二個Word或Excel文檔,啓動過程中檢測到的Word/Excel中已經開始,只是發送其他進程的文件信息並關閉。

一個簡單的應用程序,如記事本,沒有這種行爲。

這意味着,在這種情況下,您第二次啓動的Process實例值得精確計算,以便控制正在打開的文檔。

+2

因此,這可以診斷問題,但如果您還包含解決問題的適當解決方案,答案將會大大改善。 – Servy 2013-02-13 17:36:42

+0

我很欣賞爲什麼會發生這種情況的解釋,因爲這些信息一定會對您有所幫助。 – 2013-02-13 18:04:19

+0

@Servy:你是對的 - 但我不知道約束條件,我沒有看到一個解決方案保持相同的通用性水平。它將足以處理MS Office的情況嗎?應該考慮OpenOffice嗎?如果例如SublimeText,它有一個類似的「附加到正在運行的進程」的行爲,被用作默認的文本編輯器? – 2013-02-13 18:05:01