使用 VSTO 加载项以编程方式获取功能区列表

Programmatically get the list of the ribbons using VSTO add-in

我使用 Visual Studio 2019 创建了一个 C# VSTO 加载项,它从套接字连接接收命令,它可以插入文本,仅使用 office Interop 在我的功能区中修改按钮。

我想知道两件事

  1. 如何获取所有功能区的名称(主页、插入、设计、 ....) 以编程方式?
  2. 在除我创建的功能区之外的任何其他功能区上启动鼠标单击(例如单击“主页”选项卡中的粗体按钮)。

对于第二个问题,我只想使用office插件,而不是通过模拟keypress/mouse事件。

How can I get the name of all the ribbons (Home, Insert, Design, ....) programmatically?

完成这项工作没有简单的方法。您可以尝试使用 Accessibility APIMicrosoft Active Accessibility 是一种基于组件对象模型 (COM) 的技术,可改进辅助功能与 Microsoft Windows 上的应用程序 运行 协同工作的方式。它提供动态 link 库并入操作系统以及 COM 接口和 API 元素,这些元素提供可靠的方法来公开有关 UI 元素的信息。

Initiate a mouse click (for example click Bold button in the Home tab) on any other ribbons than the one I created.

您可以使用 CommandBars.ExecuteMso 方法来执行由 idMso 参数标识的控件。在特定命令没有对象模型的情况下,此方法很有用。适用于内置 buttonstoggleButtonssplitButtons 的控件。失败时,它 returns E_InvalidArg 表示无效的 idMso,E_Fail 表示未启用或不可见的控件。

Application.CommandBars.ExecuteMso("Copy")

辅助功能API(如 Eugene 所述)几乎是驱动 Outlook 功能区及其控件的唯一方法。请记住,由于 Microsoft 从未记录控件及其 ID,因此它们可能会在版本之间发生变化。

如果使用 Redemption (I am its author) is an option, it exposes SafeExplorer and SafeInspector 使用辅助功能和低级别公开功能区及其控件的对象 Windows API。

Redemption.SafeExplorer sExplorer = new Redemption.SafeExplorer();
sExplorer.Item = OutlookApplication.ActiveExplorer;
foreach (var tab in sExplorer.Ribbon.Tabs)
{
  MessageBox.Show(tab);
}