如何在 Word 应用程序中查找加载项列表

本文关键字:查找 加载项 列表 应用程序 Word | 更新日期: 2023-09-27 17:56:52

我使用Visual Studio Tools for Office(VSTO)创建了一个office:word加载项。我已将加载项的加载修改为"0"以停止其自动加载行为。

我的要求是从 c# 应用程序启动 Word 文档,并仅为此 Word 实例启用加载项。

Using Word = Microsoft.Office.Interop.Word;
{
  Word.Application wordApp;
  //Instantiate a word application
  wordApp = new Word.Application();
  wordApp.visible = true;
  // Open a document
  wordApp.Documents.Open(ref wordFile, ref Missing.value, ..... etc );  
  foreach (Word.AddIns addins in wordApp.Application.AddIns)
       MessageBox.Show(addins.ToString());
}

对于循环抛出异常:

Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Word.AddIn'  
*

如何获取/存储/迭代插件/插件列表 *

问候

如何在 Word 应用程序中查找加载项列表

众所周知,应用程序级加载项适用于特定应用程序的所有实例。我成功地仅为Office 2007 - Word和Excel应用程序的特定实例启用了应用程序级加载项。例如,如果我从 c# 应用程序启动 word 实例,则应用程序级外接程序(自定义功能区功能)将仅适用于该实例,则手动启动的所有其他实例的行为将是正常的。

每个应用程序级别外接程序都会在注册表中注册自身。因此,应用程序的每个实例都会尝试加载加载项。因此,解决方法的主要工作在于加载功能区。

在运行时,您必须决定是加载自定义功能区还是基本功能区。

为此,
->在 C# 应用程序中创建一个特定于进程的环境变量,您将在其中实例化您的 Office 应用程序 (Word/Excel)。

System.Environment.SetEnvironmentVariable("MyVar", "1", EnvironmentVariableTarget.Process);  

->检查加载项的功能区类中的变量。如果变量存在,则加载自定义功能区,如果不存在,则加载基本功能区。

public string GetCustomUI(string ribbonID)
{
   if (System.Environment.GetEnvironmentVariable("MyVar", EnvironmentVariableTarget.Process) == "1")
   {
        return GetResourceText("ExcelAddIn.ExcelRibbon.xml");
   }
   else
   {
        return GetResourceText("ExcelAddIn.BasicRibbon.xml");
   }
}

你快完成了!.但是Windows不允许你一次维护两个实例(.exes)的word/excel。因此,每个单词/Excel 实例将从同一.EXE打开,并且您的加载项将应用于所有实例。因此,将单词/excel的每个实例(.exe)分开。

有注册表黑客可以实现这一点:
在钥匙中,

HKEY_CLASSES_ROOT'Word.Document.12'shell'Open'Command

将"%1"追加到默认键值并重命名命令键。
在钥匙中,

HKEY_CLASSES_ROOT'Word.Document.12'shell'Open

重命名 DDEEXEC 密钥。

问候

终于我找到了解决问题的方法:

// This will return all the word addins
Microsoft.Office.Core.COMAddIns comAddins = wordApp.COMAddIns;
// Iterate through all the addins 
for(Microsoft.Office.Core.COMAddIns addins in wordApp.COMAddIns)
     MessageBox.Show(addin.Description);