c# - 关闭模式 Windows 窗体后,双击 VBA 无法识别的 MacroButton 字段
问题描述
我正在使用 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: Test1
MacroButton 字段时弹出对话框而不会出现任何故障。
更新
再次对该问题进行测试,确定双击后文档处于“未激活”等模式。当我单击文档的某个位置时,我可以再次双击。我在 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
如何解决这个问题?
解决方案
找到了答案。
应在相关代码执行完成后立即在类中调用SetFocus
Active 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
参考:本论坛的最后评论
推荐阅读
- python - FileNotFoundError: [Errno 2] No such file or directory instabot 错误
- python - 如何使用熊猫从现有列中的值创建新的二分列
- gcc - 为没有 root 权限的 nvcc 指定 GCC 版本
- flutter - 从 Firebase 中删除快照
- python - 了解并发 Locust 用户
- javascript - 如何在 reactJS 中创建 onclick 函数?
- crowdsourcing - Toloka 质量控制中的“最近使用的值”
- python - 如果来自另一个对象的字符串包含子字符串,则从列表中删除项目
- node.js - NodeJs 监视文件 Chokidar 并使用 FFMPEG 创建缩略图,代码挂起。内存堵塞?
- android - 如何测试 Recycler 视图列表中的文本视图值?(用浓缩咖啡)