关闭模态 Windows 表单后,双击 VBA 无法识别的 MacroButton 字段

Double clicking MacroButton field not recognized by VBA after dismissing modal Windows Form

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

这是其中一个字段的结构:

隐藏字段代码时,显示为TESTTAG: Test1

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

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

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

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

app.ExecuteMacroClickEvents() 方法中,我使用 form.ShowDialog() 方法显示模态 Windows 表单。

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

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

另一方面,当使用 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: Test1 MacroButton 字段时弹出对话框,而不需要任何失败。

更新

再次测试该问题,发现双击文档后的模式类似于'not active'。当我单击文档的某处时,我可以再次双击。我在 AddInUtilities class 和 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

如何解决这个问题?

找到答案。

应在相关代码执行完成后立即在 AddInUtilities.cs class 内调用 Active Document 的 SetFocus 方法。

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

参考:this forum

中的最后评论