C# VSTO功能区和互操作

C# VSTO功能区和互操作,c#,ms-word,vsto,ribbon,C#,Ms Word,Vsto,Ribbon,是否可以使用互操作处理来自另一个应用程序的自定义功能区按钮上的按钮单击事件 因此,如果我创建了一个Word 2010应用程序外接程序,其中创建了一个带有多个按钮的自定义选项卡,然后使用interop从C\win forms应用程序实例化Word应用程序,那么我将如何从WinForms应用程序连接到自定义功能区上的按钮单击事件?使用Word 2003,我可以通过CommandBars集合访问按钮,然后简单地连接到click事件 在进一步阅读之后,我想我要做的是找出如何使用互操作访问Ribbon对象

是否可以使用互操作处理来自另一个应用程序的自定义功能区按钮上的按钮单击事件

因此,如果我创建了一个Word 2010应用程序外接程序,其中创建了一个带有多个按钮的自定义选项卡,然后使用interop从C\win forms应用程序实例化Word应用程序,那么我将如何从WinForms应用程序连接到自定义功能区上的按钮单击事件?使用Word 2003,我可以通过CommandBars集合访问按钮,然后简单地连接到click事件

在进一步阅读之后,我想我要做的是找出如何使用互操作访问Ribbon对象模型。这可能吗

[编辑]

对于任何感兴趣的人。当我写这个问题时,我知道另一种解决问题的方法,但这意味着要将现有的实现从Office 2003升级到Office 2010,需要做很多额外的工作,因此我希望能够在VSTO外接程序之外访问Ribbon对象模型

我的解决方案是使用IpcChannel从vsto插件调用win forms应用程序。因此,我的WinForms应用程序初始化Word实例,然后打开一个服务器通道。在vsto加载项中,我处理Application.DocumentOpen,如果文档归我的应用程序所有,我将打开指向我的应用程序的客户端通道。然后,我可以通过使用共享接口从vsto加载项回拨win forms应用程序

虽然这项技术可行,但它确实有一些缺点。如果通过ipc通道的调用是同步的,那么我的应用程序将无法接触word对象,因为发生了死锁。进行异步调用会带来其他问题,但我发现我可以使用模式对话框阻止Word窗口,而不会导致死锁

虽然这不是我最初问题的确切答案,但它是另一种选择,因此我想我会与其他有此问题的人分享


如果有人知道如何在VSTO之外访问Ribbon对象模型,我仍然有兴趣知道如何访问。

编辑:我最终发现了一个包含本机C#Ribbon操作的。用它代替任何VBA业务

原职:

您不需要VSTO以编程方式访问功能区。访问以获取简短的VBA示例


我确信有一种方法可以在C#中实现同样的功能,但我还没有实现一种。如果我找到一个,我一定会分享。(其中包含一个C#-VBA解决方案。)

我也在寻找通过互操作访问ribbon的方法,不幸的是,我不得不放弃。似乎您真的需要vsto来访问功能区…因为Word是WPF,功能区不是“真正的窗口”,您甚至找不到手动附加的窗口句柄:(你应该将你的解决方案发布为一个实际的解决方案,并接受它。使用易访问性界面看起来很有趣,但我不想使用任何VBA,这有几个原因。其中一个原因是,我正在使用的系统实际上有数百万个文档、数百个基本文档和模板,因此VBA的维护和版本控制de成了一个小问题。我们的文档或模板都没有启用宏,并且我们的网络管理员强制执行高级别的宏安全性。(下一篇评论续)使用VBA并不能解决与我的winforms应用程序通信的问题,许多年前,我们在迁移到VSTO之前使用VBA解决方案,我们必须使用SendMessage和PostMessage从VBA通知winforms应用程序并覆盖表单上的WndProc方法,这不是一个非常漂亮的解决方案。因此,除非我可以使用Accessibil在我的C#winforms应用程序中直接从自定义ribbon控件上侦听鼠标单击事件,然后我的问题没有得到解决。不过,这与回答我最初的问题非常接近。