关闭模态 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
中的最后评论
我正在使用 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
中的最后评论