【问题标题】:VSTO Ribbons and InteropVSTO 功能区和互操作
【发布时间】:2011-07-18 03:04:08
【问题描述】:

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

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

经过进一步阅读,我想我想做的是找出如何使用互操作访问功能区对象模型。这可能吗?

[编辑]

对于任何有兴趣的人。当我写这个问题时,我知道另一种方法来解决我的问题,但这意味着需要大量额外的工作来改变我现有的实现以从 Office 2003 升级到 Office 2010,所以我希望可以访问 Ribbon 对象VSTO 加载项之外的模型。

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

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

虽然这不是对我最初问题的确切答案,但它是一种替代方法,所以我想我会与其他遇到此问题的人分享。

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

【问题讨论】:

  • 我也在寻找一种通过互操作访问功能区的方法,不幸的是我不得不放弃。看来您确实需要 vsto 才能访问功能区...
  • 由于 Word 是 WPF 而功能区不是“真正的窗口”,您甚至找不到手动附加的窗口句柄:(
  • 您应该将您的解决方案发布为实际并接受它

标签: c# ms-word vsto ribbon


【解决方案1】:

编辑:我终于发现了一个结合了原生 C# 功能区操作的 code.msdn.microsoft.com project。使用它而不是任何 VBA 业务。

原帖:

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

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

【讨论】:

  • 使用 Accessibility 界面看起来很有趣,但我不想使用任何 VBA,这有几个原因。一个是我正在处理的系统实际上有数百万个文档和数百个基本文档和模板,因此 VBA 代码的维护和版本控制变得有点问题。我们的文档或模板均未启用宏,并且我们的网络管理员强制执行高级宏安全性。 (下一条评论继续)
  • 使用 VBA 并不能解决与我的 winforms 应用程序通信的问题,很多年前我们在迁移到 VSTO 之前使用 VBA 解决方案,我们不得不使用 SendMessage 和 PostMessage 来通知 winforms 应用程序VBA 并覆盖表单上的 WndProc 方法,这不是一个非常好的解决方案。因此,除非我可以使用辅助功能界面直接从我的 C# winforms 应用程序中侦听自定义功能区控件上的鼠标单击事件,否则我的问题并没有解决。
  • 但是这非常接近于回答我原来的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2015-07-28
  • 2011-10-12
  • 1970-01-01
  • 2020-06-05
相关资源
最近更新 更多