2014-04-04 71 views
2

我正在編寫一個小程序,它將打開Word,Excel或Powerpoint文件,檢查這些文件而不做任何修改,然後再次退出相應的應用程序。例如。對於這個詞貌似遵循和正常文件正常工作:如果Quit()不起作用,則終止進程

s_word.Quit(false); 
Marshal.ReleaseComObject(s_word); 
s_word = null; 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 

我也有,應退出應用程序,如果它不x秒後退出的定時器。但是,如果出現任何對話等,我會遇到問題。打開文檔時出現密碼提示。我會遇到我的超時,但上面的所有命令都不會退出應用程序。 因此,我添加了一個硬進程kill方法,它只會查找所有WINWORD進程並殺死它們。雖然這可行,但我想避免這個問題。例如,下次打開失敗的文檔時,Word會詢問您是否修復它。

那麼,有沒有更好的辦法強制Office應用程序退出?

+0

我沒有解決您的問題,但不使用辦公室interopt,你可以嘗試「Open XML SDK 2.5 Office」我不是100%確定它可以打開哪些文件,但至少它不會啓動一個新的進程,當你打開文件。 – Peter

+0

我主要有舊的(非xml)Office文件,所以這不是一個真正的選擇。 – silent

+0

我在處理這個事情時總是這樣做,我實現了IDisposable並覆蓋了Dispose方法。 –

回答

2

我已經創建了一個非常天真的代碼片斷,它可以讓你獲得剛剛啓動的Office程序實例的進程,但不會改變其他人。然後你可以調用processInstance.Kill()來結束它。

 Process[] oldRunningWordInstances = Process.GetProcessesByName("Microsoft Word"); 
     Word.Application application = new Word.Application(); 
     Process[] newRunningWordInstances = Process.GetProcessesByName("Microsoft Word"); 
     Process applicationProcess = null; 
     foreach (Process p in newRunningWordInstances) 
      if (!oldRunningWordInstances.Contains(p)) 
      { 
       applicationProcess = p; 
       break; 
      } 

     applicationProcess.Kill(); 

這種方法獲取過程(ID)在理論上是不可靠的。有可能有更好的解決方案來獲得這個過程。

+0

謝謝,我以前見過這個,但最後這與我現在所做的並沒有什麼不同。我想不必以某種方式殺死這個過程...... – silent