VSTO Word加载项 - 如果从可执行文件启动Word,则不会触发新文档事件

时间:2014-04-01 09:58:50

标签: ms-word vsto add-in office-interop

在我的插件中,我需要为每个打开的文档创建一个任务窗格。在外接程序的启动方法中,我订阅了ApplicationEvents4_Event.NewDocument和Application.DocumentOpen事件,然后为每个打开的文档创建一个任务窗格:

((ApplicationEvents4_Event)Application).NewDocument += CreateTaskPaneWrapper;
Application.DocumentOpen += CreateTaskPaneWrapper;

foreach (Document document in Application.Documents)
{
    CreateTaskPaneWrapper(document);
}

这包括通过Word菜单打开或创建文档,或在操作系统中打开现有文档文件的情况。但是,如果已经打开Word,启动WINWORD.EXE(或通过快捷方式访问它,这是一种非常常见的情况)并不触发任何一个事件,尽管新窗口打开了一个新文档。如何对此方案做出反应并为以这种方式创建的文档创建任务窗格?我使用的是VSTO 3和Visual Studio 2008,目标是Word 2007。

3 个答案:

答案 0 :(得分:2)

如果Word已启动,则会在加载项加载之前创建新文档,因此无法捕获此事件。

如果您需要使用最初创建的文档,只需查看Documents集合 - 如果Count大于零,则此文档是在加载外接程序之前由Word创建的文档。

答案 1 :(得分:2)

所以我在我的解决方案中解决了这个问题,虽然我不确定它是否适用。可悲的是,我的是VB.Net,因此可能需要进行一些翻译。

首先,我最终没有使用ApplicationEvents4_Event而是有其他内置的事件触发器可以通过" ThisAddIn"

  Private Sub Application_NewDocument(ByVal Doc As Word.Document) Handles Application.NewDocument
        'MsgBox("I opened something")
        myCustomTaskPane = Me.CustomTaskPanes.Add(New MyCustomTaskPaneClass, "TaskPane", Doc.ActiveWindow)
        myCustomTaskPane.Visible = True
    End Sub

使用这种方法我确实遇到过类似的挑战。运行winword.exe,从而打开一个新的word文档,没有触发NewDocument事件。幸运的是,还有另一个事件要使用 - 文档更改。

Private Sub Application_DocumentChange() Handles Application.DocumentChange
    'function to test if the ActiveDocument has a taskpane from my add-in, and then a function to add one        
    If Not HasMyCustomTaskPane() then AddCustomTaskPane()
End Sub

所以 - 底线,无论你是否继续使用ApplicationEvents4_Event,你应该看看你是否可以使用DocumentChange事件。它会在选择新的单词窗口时触发。

答案 2 :(得分:1)

处理Word中多个窗口的任务窗格相当复杂,因为Word加载并重新使用打开的窗口。要正确地执行此操作,您必须考虑不同的操作:

  • 用户执行操作以显示或隐藏任务窗格。
  • 用户创建新文档。
  • 用户打开现有文档。
  • 用户关闭打开的文档。

有一个教程可以探讨VB和C#中的所有细节:https://msdn.microsoft.com/en-us/library/bb264456%28v=office.12%29.aspx

我还找到了similar answer on SO