2011-10-10 55 views
4

我正在使用Microsoft Word主互操作程序集從屬MS Word。我的應用程序打開它自己的Word窗口(使用Microsoft.Office.Interop.Word.Application的實例)。在應用程序執行完畢後,我想關閉打開的Word窗口,但是我不想影響用戶可能打開的其他Word窗口。如果我使用Application.Quit,則所有的Word窗口最終都會關閉。如果我使用Application.ActiveWindow.Close,那麼單詞文檔會關閉,但我創建的Word窗口仍然保持打開狀態,並且是不合需要的空白屏幕。Word互操作 - 如何關閉一個Word窗口而不關閉所有窗口?

如何通過其API告訴Word關閉我打開的Word實例而不影響其他實例?這與單擊Word窗口右上角的X時的行爲類似。

回答

0

使用Word.Application.Quit()Marshall.FinalReleaseComObject(Word.Application)我已經能夠同時打開Word的多個實例,並且只能關閉特定實例。

下面是一些快速的示例代碼(從C#控制檯應用程序):

using System.Runtime.InteropServices; 
using Microsoft.Office.Interop.Word; 

namespace WordTest 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var p = new Program(); 
      p.Test(); 
     } 

     public void Test() 
     { 
      var msWord = new Application(); 

      CloseWord(msWord); 
     } 

     public void CloseWord(Application word) 
     { 
      if (word != null) 
      { 
       word.Quit(); 
       Marshal.FinalReleaseComObject(word); 
      } 
     } 
    } 
} 

參見:c# MSOffice Interop Word will not kill winword.exe

2

我意識到這是一個有點晚了修復,但這個工作對我來說;

創建Word應用程序對象時,先創建一個臨時Word對象,先打開它,然後打開正確的Word文檔...然後關閉臨時對象。

這可能看起來像是在浪費空間和內存,但這樣做是爲了確保您創建的winword.exe保持獨立,並且新創建的文檔不會與您的文檔掛鉤。

Private sub OpenWord() 

Dim MyWord as Object 
Dim MyTempWord as Object 

//I use the CreateObject in my application, but this will be however 
//you declare your word application 

MyTempWord = CreateObject("Word.Application") 
MyWord = CreateObject("Word.Application") 
MyTempWord.Quit(SaveChanges:=0) 


//*Carry on doing whatever your app does* 

//*After Finishing App stuff Close it...* 

    If MyWord IsNot Nothing Then 
     MyWord.Quit(SaveChanges:=0) 
     Marshal.FinalReleaseComObject(MyWord) 
    End If 

End Sub 

要重現這個問題我在我的應用程序中打開了字,然後通過快捷方式(如Microsoft Office Word)中打開一個單獨的詞。當我的應用程序調用MyWord.Quit()時,它會關閉兩個文檔實例。問題是新創建的文檔掛鉤到您的應用程序創建的WINWORD.EXE中,因此,當您關閉應用程序時,它會關閉另一個文檔(即使它們出現在不同的實例中)。

我花了很長時間修復,我希望它可以幫助別人!

+0

爲我工作,但無法理解它背後的邏輯。 – m2pathan