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

sdd*_*dds 5 vsto add-in ms-word office-interop

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

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

foreach (Document document in Application.Documents)
{
    CreateTaskPaneWrapper(document);
}
Run Code Online (Sandbox Code Playgroud)

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

小智 6

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

如果您需要处理最初创建的文档,只需查看 Documents 集合 - 如果 Count 大于零,则该文档是 Word 在加载加载项之前创建的文档。


Ste*_*ico 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
Run Code Online (Sandbox Code Playgroud)

使用这种方法我确实遇到了类似的挑战。运行 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
Run Code Online (Sandbox Code Playgroud)

因此,底线是,无论您是否继续使用 ApplicationEvents4_Event,您都应该查看是否可以使用 DocumentChange 事件。当选择新单词窗口时会触发它。