65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 为 Outlook 2003 添加自定义属性页

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (15投票s)

2004年11月30日

3分钟阅读

viewsIcon

131760

downloadIcon

885

如何创建自定义属性页并将其添加到 Outlook 2003

引言

在本文中,我将解释如何向 Outlook 2003 添加自定义属性页。属性页可以添加到 Outlook 选项对话框或文件夹属性对话框。

我假设你有一个正在运行的 Outlook 加载项,创建 Outlook 加载项不在本文的讨论范围之内。有很多很好的文章介绍了这个主题。

OptionsPagesAdd 事件

您需要处理 OptionsPagesAdd 事件以添加自定义属性页。 此事件由您的应用程序对象或您的命名空间对象引发。 如果要将自定义属性页添加到 Outlook 选项对话框,则必须处理来自应用程序对象的 OptionsPagesAdd 事件,如果要将其添加到文件夹属性对话框,则处理由命名空间对象引发的事件。

applicationObject.OptionsPagesAdd +=
new ApplicationEvents_11_OptionsPagesAddEventHandler(
  applicationObject_OptionsPagesAdd);
private void applicationObject_OptionsPagesAdd(PropertyPages Pages){}
NameSpace ns = applicationObject.GetNamespace("MAPI");
ns.OptionsPagesAdd +=
new NameSpaceEvents_OptionsPagesAddEventHandler(ns_OptionsPagesAdd);
private void ns_OptionsPagesAdd(
  PropertyPages Pages, MAPIFolder Folder){}

添加自定义属性页

我们将使用 PropertyPagesadd 方法将自定义属性页对象添加到集合。

Page.Add(object page, string title);

add 方法的第一个参数需要一个代表我们自定义属性页的对象。 我们通过实现 Outlook.PropertyPage 接口来创建我们的属性页。 此外,为了方便地向我们的属性页添加控件,我们继承自 System.Windows.Forms.UserControl

创建自定义属性类

public class MyOptionPage : System.Windows.Forms.UserControl , 
  Outlook.PropertyPage {}

PropertyPage 接口希望我们实现三个方法

  • public bool Dirty
  • public void GetPageInfo(ref string HelpFile, ref int HelpContext)
  • public void Apply()

如果您的属性页的内容已被更改,则 Dirty 属性返回 true。 Microsoft Outlook 查询此属性以确定是否显示“应用”按钮。

通过 GetPageInfo 方法,您可以指定与属性页关联的帮助文件。

Apply 方法中,您编写代码来实现如何对用户更改做出反应。 例如,将值存储到注册表或写入配置文件等。

我们自定义的 PropertyPage 现在看起来像这样。 我假设您向 PropertyPage 添加了一个按钮。 以下代码为了更好的可读性而简化。 查看源代码以获取完整代码。

public class MyOptionPage : System.Windows.Forms.UserControl , 
  Outlook.PropertyPage
 {
      private bool isDirty;
      public MyOptionPage()
      { InitializeComponent();
        isDirty = false;
      } 
    public bool Dirty{get{return isDirty;}}
    public void Apply() { MessageBox.Show("Hello World"); }
    private void button1_Click(object sender, System.EventArgs e)
    { isDirty = true; } 
}  

它是否在工作?

我们现在可以尝试添加自定义属性页。

Pages.Add(new MyOptionPage(),"Hello");

我们的新选项卡名为“未命名”

即使我们的新选项卡显示在属性对话框中,它的名称也被设置为“未命名”。 出于未知原因,add 方法的第二个参数被忽略。 我们需要在我们的 MyOptionPage 类中实现一个自定义标题属性,以使 Outlook 显示所需的选项卡名称。

[DispId(-518)]
public string Caption
{
get{return "DEMO";}
}

您必须添加 using System.Runtime.InteropServices 才能使用 DispID 属性。

单击按钮不会启用“应用”按钮

我们需要修复的另一个问题是,即使我们按下我们的按钮并因此设置 isDirty=true,Outlook 也不会启用“应用”按钮。

根据 MSDN,Microsoft Outlook 响应 OnStatusChange 方法来查询 Dirty 属性,该方法属于 PropertyPageSite 对象。

获取 PropertyPageSite 对象

不幸的是,PropertyPageSite 对象是一个不安全的私有字段,我们必须使用反射才能访问它。

定义一个成员变量 private Outlook.PropertyPageSite ppSite 并将以下代码放在您的 MyOptionPage 类的 Load 事件中

Type myType = typeof(System.Object); 
string assembly = 
System.Text.RegularExpressions.Regex.Replace(myType.Assembly.CodeBase, 
  "mscorlib.dll", "System.Windows.Forms.dll");
assembly = System.Text.RegularExpressions.Regex.Replace(
  assembly, "file:///", "");
assembly = System.Reflection.AssemblyName.GetAssemblyName(
  assembly).FullName;
Type unmanaged =
Type.GetType(System.Reflection.Assembly.CreateQualifiedName(
  assembly, "System.Windows.Forms.UnsafeNativeMethods"));
Type oleObj = unmanaged.GetNestedType("IOleObject");
System.Reflection.MethodInfo mi = oleObj.GetMethod("GetClientSite");
object myppSite = mi.Invoke(this, null);
this.ppSite = (Outlook.PropertyPageSite)myppSite;

调用 PropertyPage 对象的 OnStatusChange() 方法

当用户单击我们的按钮时,我们现在可以在设置 isDirty = false 之后调用 OnStatusChange 方法。

private void button1_Click(object sender, System.EventArgs e)
    { isDirty = true; ppSite.OnStatusChange();} 

最终注释

向 Outlook 2003 添加自定义属性页有点棘手,主要是因为没有直接公开 PropertyPageSite 对象。

我希望你觉得这篇文章有用,我期待你的反馈。

© . All rights reserved.