2012-10-01 75 views
5

在Microsoft Word第一次加載時,NewDocument和DocumentOpen事件都未激發。當一個Word的實例已經打開並且打開一個新的或現有的文檔時,這些事件就會正常啓動。如何處理Word DocumentChange事件,因爲NewDocument事件未在加載時觸發

我見過的建議是處理DocumentChange事件(它總是在Word加載時觸發)而不是其他兩個事件。

我的問題是我將如何去做這件事? DocumentChange事件沒有任何參數,所以我怎麼知道文檔(新的或現有的)何時被打開?

此外,我已經在DocumentChange事件中的邏輯和新的和現有的文件的處理是不同的,所以我不能只是把我所有的代碼放入事件。

private void ThisAddIn_Startup(object sender, System.EventArgs a) 
{ 
    this.Application.DocumentChange += new ApplicationEvents4_DocumentChangeEventHandler(Application_DocumentChange); 
} 

private void Application_DocumentChange() 
{ 
    // How do I handle NewDocument or DocumentOpen? 
} 

回答

2

所以我最終在ThisAddIn_Startup中處理加載的文檔。如果文檔的路徑是空字符串,那麼我們知道文檔是新的,並且從未保存在本地機器上。否則,我知道它被保存(包括在臨時目錄中),並將其作爲現有文檔處理。

private void ThisAddIn_Startup(object sender, System.EventArgs a) 
{ 
    try 
    { 
    Word.Document doc = this.Application.ActiveDocument; 
    if (String.IsNullOrWhiteSpace(doc.Path)) 
    { 
     ProcessNewDocument(doc); 
    } 
    else 
    { 
     ProcessDocumentOpen(doc); 
    } 
    } 
    catch (COMException e) 
    { 
    log.Debug("No document loaded with word."); 
    } 

    // These can be set anywhere in the method, because they are not fired for documents loaded when Word is initialized. 
    ((MSWord.ApplicationEvents4_Event)this.Application).NewDocument += 
    new MSWord.ApplicationEvents4_NewDocumentEventHandler(Application_NewDocument); 
    this.Application.DocumentOpen += 
    new MSWord.ApplicationEvents4_DocumentOpenEventHandler(Application_DocumentOpen); 
} 

至於我的傑尼的回答狀態註釋: 設置在ThisAddIn.Desiger.cs的初始化DocumentOpen事件處理()方法處理爲現有的文件,但新建文檔不會調用初始化的新文檔Word中打開時,所以這個解決方案不起作用。因此,我將DocumentOpen和NewDocument的設置留在了ThisAddIn_Startup事件中,否則當Word使用文檔加載時,DocumentOpen也會被觸發。

2

This鏈接會幫助你,基本上他們說那是什麼ThisAddIn_Startup運行DocumentOpen事件已經運行完畢後。還有一個問題的解決方法,只需按照超鏈接。

+0

這適用於_DocumentOpen,但對於_NewDocument不起作用。我記得在某處讀到_NewDocument僅在用戶執行File-> New時觸發,而不是在Word打開時顯示新文檔。如果這是真的,關於如何在word打開時處理新文檔的任何想法?每次Word獲得焦點時,_WindowActivate都會觸發,而不僅僅是第一次打開Word。所以我可以嘗試處理_WindowActivate,但我覺得這可能會變得混亂。思考? –

1

我在啓動處理程序中使用Application.Documents集合來查找加載項加載之前存在的所有文檔。它可以完成你的答案所做的同樣的事情,再加上,如果以後因需求(而不是在Word啓動時)加載加載項,枚舉集合可能不僅僅是活動文檔。

只要ActiveDocument發生更改,DocumentChange()事件就會觸發。 Word一次只有一個活動文檔。在多個打開的Word文檔之間切換將觸發該事件。另外,在關閉文件時,事件可能會在另一個打開文件變爲活動狀態時觸發。它也會在最後一個文檔關閉後觸發,在這種情況下,Application.ActiveDocument將無效。