2016-11-25 71 views
1

我开发了一个Outlook加载项,必须打开或关闭。在VSTO插件中存储一些数据的最佳方式是什么?

这样做,我已经声明一个静态变量,如下图所示,

ThisAddIn.cs

public static bool isAddInOn = false; 

RibbonButton.cs

private void btnRibbon_Click(object sender, RibbonControlEventArgs e) 
    { 
     if (ThisAddIn.isAddInOn) 
     { 

      ThisAddIn.isAddInOn = false; 
      btnRibbon.Label = "Disabled"; 

     } 
     else 
     { 

      ThisAddIn.isAddInOn = true; 
      btnRibbon.Label = "Enabled"; 


     } 
    } 

这是工作。但是,当我关闭Outlook并再次打开时,静态变量会重新设置。这意味着当我打开Outlook默认情况下,我的加载项处于禁用状态。

我只是想在某个地方存储该值。所以我可以在Outlook重新打开时检查该值。

场景:

1)开放前景

2)使能附加通过点击它的标识(即在色带)

3)现在关闭前景

4)当我再次打开Outlook时,它必须启用

那么我该如何实现这一目标?

回答

0

设置可以作为隐藏(关联)项目存储在文件夹中,例如收件箱或日历文件夹。例如,Outlook将类别列表作为隐藏项目存储在日历文件夹中。 POP3邮件ID存储在收件箱中的隐藏项目中。隐藏项目的优势在于漫游功能 - Exchange邮箱用户可以从任何计算机上查看数据。

您可以在OutlookSpy中看到隐藏项 - 点击IMAPIFolder按钮,进入“关联内容”选项卡。

通过编程方式,可以使用Outlook对象模型中的MAPIFolder.GetStorage来访问这些项目。

2

有几种技术可以用来实现这个结果。确保您的设置必须在启动加载项期间序列化为某些存储/反序列化。

其中一个可能的解决办法是使用该注册(在这种情况下可能HKCU(当前用户,那么这将是私人使用的加载项),并没有特别许可,需要每个用户。

用于存储变量:

public void StoreInRegistry(string keyName, string value) 
    { 
     RegistryKey rootKey = Registry.CurrentUser; 
     string registryPath = @"Software\YourCompanyName\YourAddInName"; 
     using (RegistryKey rk = rootKey.CreateSubKey(registryPath)) 
     { 
      rk.SetValue(keyName, value, RegistryValueKind.String); 
     } 
    } 

为了读取变量:

public string ReadFromRegistry(string keyName, string defaultValue) 
    { 
     RegistryKey rootKey = Registry.CurrentUser; 
     string registryPath = @"Software\YourCompanyName\YourAddInName"; 
     using (RegistryKey rk = rootKey.OpenSubKey(registryPath, false)) 
     { 
      if (rk == null) 
      { 
       return defaultValue; 
      } 

      var res = rk.GetValue(keyName, defaultValue); 
      if (res == null) 
      { 
       return defaultValue; 
      } 

      return res.ToString(); 
     } 
    } 

这种存储/取回的变量应在使用加载初始化集合Y我们的财产。因此,修改可能看起来像:

ThisAddin.cs

public static bool isAddInOn = ReadFromRegistry("MySetting1", "0") == "1"; 

RibbonButton.cs

private void btnRibbon_Click(object sender, RibbonControlEventArgs e) 
{ 
    if (ThisAddIn.isAddInOn) 
    { 

     ThisAddIn.isAddInOn = false; 
     btnRibbon.Label = "Disabled"; 

    } 
    else 
    { 

     ThisAddIn.isAddInOn = true; 
     btnRibbon.Label = "Enabled"; 


    } 
    StoreInRegistry("MySetting1", ThisAddIn.isAddInOn ? "1" : "0"); 
} 

其他选项可序列化文件 - 一些类的设置序列化,即独立存储,数据库(本地或中央)等。

+0

感谢您的建议。但如果用户没有管理权限呢?它是否仍然可以在注册表中更改? –

+1

除非明确重置特定密钥的权限,否则用户始终拥有HKCU中密钥的权利(与HKLM不同) –

相关问题