Click here to Skip to main content
Click here to Skip to main content

Adding custom property pages to Outlook 2003 using C#

By , 30 Nov 2004
 

Introduction

In this article I will explain how to add custom property pages to Outlook 2003. PropertyPages can either be added to the Outlook Options dialog box or to the folder Properties dialog box.

I assume you have a running Outlook Add-In , creating an Outlook Add-In is beyond the scope of this article. There are plenty of good articles covering this topic.

OptionsPagesAdd Event

You need to handle the OptionsPagesAdd Event to add a custom property page. This event is either raised by your application object or by your namespace object. If you want to add a custom property page to the Outlook Option dialog you have to handle the OptionsPagesAdd event from the application object, if you want to add it the folder properties dialog box you handle the event raised by the namespace object.

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){}

Adding a Custom property page

We will use the PropertyPages add method to add a custom property page object to the collection.

Page.Add(object page, string title);

The first parameter of the add method expects an object representing our custom property page. We create our property page by implementing the the Outlook.PropertyPage interface. Furthermore to have a convenient way of adding controls to our property page we inherit from System.Windows.Forms.UserControl.

Creating a custom property class

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

The PropertyPage Interface expects us to implement three methods:

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

The is Dirty property returns true if the contents of your property page have been altered. Microsoft Outlook queries this property in order to decide if the Apply Button will be visible or not.

With the GetPageInfo method you can specify the Help file associated with the property page.

Within the Apply method you write the code that implements how to react on user changes. e.g. store the values to the registry, or write config files etc.

Our custom PropertyPage would now look something this. I assume you added a button to the PropertyPage. The following code is simplified for better readability. Take a look at the sourcecode for the full code.

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; } 
}  

Is it working ?

We can now try to add the custom property page.

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

Our new tab is named "Unnamed"

Even though our new tab is displayed in the property dialog , its name is set to "Unnamed". For unknown reasons the second parameter of the add Method is ignored. We need to implement a custom caption property in our MyOptionPage class to make Outlook display the desired Tab Name.

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

You have to add using System.Runtime.InteropServices to be able to use the DispID Attribute.

Clicking the button does not enable the Apply button

Another issue we have to fix is the fact that even if press our Button and thus setting isDirty=true Outlook is not enabling the Apply Button.

According to MSDN Microsoft Outlook queries the Dirty property in response to the OnStatusChange method of a PropertyPageSite object.

Getting the PropertyPageSite object

Unfortunately the PropertyPageSite object is an unsafe private field , we have to use reflection to get access to it.

Define a member variable private Outlook.PropertyPageSite ppSite and put the following code in your Load event of you MyOptionPage class:

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;

Calling the OnStatusChange() method of the PropertyPage object

When the user clicks our button we now can call the OnStatusChange method after setting isDirty = false.

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

Final Notes

Adding custom property pages to Outlook 2003 is a little tricky, mainly because of the not directly exposed PropertyPageSite object.

I hope you find the article useful and I am looking forward to your feedback.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Hannes Pavelka
Germany Germany
Member
Feel free to visit my blog at www.hannes-pavelka.com

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralGetting PropertyPageSitememberJon Webb19 Nov '09 - 8:13 
GeneralRe: Getting PropertyPageSitememberJon Webb20 Nov '09 - 7:54 
GeneralThanks youmemberdusna27 Jan '09 - 2:25 
GeneralApplying Themes to the PropertyPagememberPavelsua28 May '08 - 22:21 
GeneralCannot add message boxes to property pagesmemberVimzz8 May '08 - 23:03 
GeneralRe: Cannot add message boxes to property pagesmemberdigicate2 Apr '12 - 17:32 
Hi Vimzz,
If your PropertyPage contains TabControl > TabPage > Button > Click() > MessageBox.Show(), Outlook 2007 will freeze.
Don't use TabControl on PropertyPage or use this workaround:
Add a control e.g. TextBox on UserControl container outside of TabControl. Call _Control.Focus() before MessageBox.Show(). Outlook no longer freezes.
There may be a bug in the way the message loop processes windows messages when opening a dialog from a TabControl embedded in another TabControl.
QuestionHow to add custom property pages to PowerPoint 2003 and 2007 using C# ?memberDarwin DeVore2 May '08 - 19:59 
Questioncan't get example to work - what am i doing wrong?membera332188949527 Jul '07 - 13:31 
AnswerRe: can't get example to work - what am i doing wrong?memberMember 301209527 Feb '09 - 13:26 
QuestionDisplaying custom propetymemberA. Bhandari a.k.a Amit Bhandari2 Jul '07 - 2:29 
NewsError : The operation Failedmemberprakash.guru2 Jun '07 - 4:59 
GeneralRe: Error : The operation FailedmemberMOLBERG21 Jul '07 - 21:31 
QuestionError while calling OnStatusChange()membercodebased4 Apr '07 - 20:09 
AnswerRe: Error while calling OnStatusChange()memberPeterClark20 Nov '08 - 7:54 
QuestionHow do i read digital signature? Pls. helpmemberay-ay17 Jan '07 - 16:31 
Generalconvert to vb [modified]membertap5238420 Sep '06 - 20:46 
GeneralProblem!!! Please helpmemberDLL_hell11 Jul '06 - 22:29 
GeneralClose Options PagememberBikash Rai28 Oct '05 - 23:37 
GeneralWhen Deploy it in other machines...membertmg_20009 Jul '05 - 22:22 
GeneralSetting the background colourmembermball16 Feb '05 - 23:00 
GeneralRe: Setting the background colourmemberDavid Wulff15 May '05 - 14:40 
QuestionRe: Setting the background colourmemberahardy9 Oct '06 - 18:29 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130516.1 | Last Updated 30 Nov 2004
Article Copyright 2004 by Hannes Pavelka
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid