-1

我正在使用 VSTO 开发一个 word 插件。在涉及的 Word 文档表面上有几个 MacroButton 字段。为了解决字段的双击事件,我在模板 (MyTestProject.dotm) 中使用了 VBA 宏。

这是其中一个字段的结构: 在此处输入图像描述

当域代码隐藏时,它显示为TESTTAG: Test1

双击执行中的TESTTAG: Test1以下脚本时MyTestProject.dotm

Public Sub TPS_TestTag()
    Set addIn = Application.COMAddIns("MyVSTO")
    Set automationObject = addIn.Object
    automationObject.HandleClickEvents
End Sub

AddInUtilities.cs我的 VSTO 项目中有以下方法:

public void HandleClickEvents()
{
    using (MyProject.Application app = new MyProject.Application())
    {
        app.ExecuteMacroClickEvents();  
    }
}

在该app.ExecuteMacroClickEvents()方法中,我使用form.ShowDialog()了显示模式 Windows 窗体的方法。

在我第一次双击 时TESTTAG: Test1,我的表单出现了。然后TESTTAG: Test1出现选中:

在此处输入图像描述

如果我关闭表单并立即TESTTAG: Test1再次双击标签,而不单击其他任何地方,TPS_TestTag()MyTestProject.dotm不会执行。如果我再次双击标签,VBA 将执行并显示对话框。如果我再次关闭对话框并继续双击,对话框将不会显示,在下一次尝试 - 对话框显示。同样的行为继续。

另一方面,当使用该form.Show()方法显示 Windows 窗体时,不会出现此问题。

您可以在 VSTO 项目中使用以下方法AddInUtilities.cs来复制此问题。

public void HandleClickEvents()
{
    Form objForm = new Form(); 
    objForm.Width = 300;
    objForm.Height = 300;
    //objForm.Show();      /* This doesn't give the issue */
    objForm.ShowDialog();  /* This gives the issue */
}

现在我的问题是:

我确实需要使用该objForm.ShowDialog()方法来显示对话框,同时我需要在每次双击TESTTAG: Test1MacroButton 字段时弹出对话框而不会出现任何故障。

更新

再次对该问题进行测试,确定双击后文档处于“未激活”等模式。当我单击文档的某个位置时,我可以再次双击。我在 AddInUtilities 类和TPS_TestTag()VBA 方法中尝试了以下代码。但他们都没有工作。

object word = System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
wordApp = (Word.Application)word;    
wordApp.ActiveDocument.Activate(); //or
wordApp.ActiveDocument.ActiveWindow.ActivePane.Selection.Select();

VB代码

Public Sub TPS_TestTag()
    Set addIn = Application.COMAddIns("MyVSTO")
    Set automationObject = addIn.Object
    automationObject.HandleClickEvents
    Word.ActiveDocument.Activate
End Sub

如何解决这个问题?

4

1 回答 1

0

找到了答案。

应在相关代码执行完成后立即在类中调用SetFocusActive Document 的方法。AddInUtilities.cs

public void HandleClickEvents()
{
    using (MyProject.Application app = new MyProject.Application())
    {
        app.ExecuteMacroClickEvents();  
        Globals.ThisAddIn.Application.ActiveWindow.SetFocus();
    }
}

或修改 VBA 代码,

Public Sub TPS_TestTag()
    Set addIn = Application.COMAddIns("MyVSTO")
    Set automationObject = addIn.Object
    automationObject.HandleClickEvents
    word.Application.ActiveWindow.SetFocus
End Sub

参考:本论坛的最后评论

于 2020-03-12T17:11:41.870 回答