次の方法で共有


Outlook 2010 ソリューション モジュールのプログラミング

**概要:**Microsoft Office Outlook 2007 では、フォルダーをプログラムによって作成し、ナビゲーション ウィンドウ上でそのフォルダーに移動することができました。ただし、そのフォルダーにはメール、予定表 (会議出席依頼と予定を含む)、連絡先、タスク、履歴、メモなど、組み込みの Outlook アイテムが含まれている必要がありました。Microsoft Outlook 2010 では、ソリューション モジュールを使用して、カスタムの種類のアイテムが含まれるフォルダーにも移動できます。ここでは、ソリューション モジュールの概要を説明し、ソリューション モジュールを使用して解決できる問題の例を提示し、ソリューション モジュールを実装する具体的な方法を示すサンプル アドインを提供します。

適用対象: Office 2010 | Outlook 2010

この記事の内容
概要
Outlook のナビゲーション モジュール
何が問題なのか
ソリューション モジュールのプログラミング
サンプル アドイン
その他の注意事項
まとめ
その他の技術情報

目次

  • 概要

  • Outlook のナビゲーション モジュール

  • 何が問題なのか

  • ソリューション モジュールのプログラミング

  • サンプル アドイン

  • その他の注意事項

  • まとめ

  • その他の技術情報

概要

長年の間、Outlook のナビゲーション ウィンドウにカスタム モジュールを追加する機能は、開発者から要望されていました。Microsoft Outlook 2010 では、この機能がソリューション モジュール オブジェクト モデルによって提供されます。ソリューション モジュールは、プログラムによってナビゲーション ウィンドウに追加できるナビゲーション モジュールです。実のところ、ソリューション モジュールを追加する手段はコード以外にありません。ユーザー インターフェイスを使用してソリューション モジュールを作成することはできません。ソリューション モジュールは、フォルダー階層を検索したり、カスタマイズしたアイテムの種類をフォルダーに保存したりすることができる強力な機能です。たとえば、顧客関係管理 (CRM) アプリケーションでは、取引先担当者、取引先企業、営業案件など、カスタムのアイテムの種類をソリューション モジュールとして公開できます。また、アドインの開発者は、Outlook 2010 を使用して、カスタムのアイテムの種類を含むフォルダーごとにカスタムのフォルダー アイコンを設定できます。図 1 は、ソリューション モジュールのサンプルである "Solution Demo" を示しています。

図 1. Outlook 2010 のソリューション モジュールの例

Outlook 2010 のサンプル ソリューション モジュール

Outlook のナビゲーション モジュール

Outlook 2007 は、固有のカスタム フォルダーを備えたソリューションをビルドできる多機能のモデルをサポートしています。これらのフォルダーには、メール、予定表アイテム、連絡先、タスクなど、組み込みの Outlook アイテムの種類を格納できます。既存のナビゲーション モジュールを使用して、カスタム フォルダーに簡単に移動できます。組み込みの Outlook アイテムの種類に一致するナビゲーション モジュールの例を以下に示します。

  • [連絡先] および [フォルダー一覧] ナビゲーション モジュールは、連絡先アイテムの種類が格納された、次のようなフォルダーを表示できます。

    • 人事グループ用のフォルダー。たとえば、面接予定者の一覧をこのフォルダーに格納し、応募者に閲覧を許可できます。

    • 営業グループ用のフォルダー。たとえば、見込み客の一覧をこのフォルダーに格納し、営業担当者に閲覧を許可できます。

  • [予定表] および [フォルダー一覧] ナビゲーション モジュールは、予定表アイテムの種類が格納された、次のようなフォルダーを表示できます。

    • 人事グループ用のフォルダー。たとえば、面接の予定をこのフォルダーに格納できます。

    • 営業グループ用のフォルダー。たとえば、アカウント プランニングの重要な日程をこのフォルダーに格納できます。

  • [タスク] および [フォルダー一覧] ナビゲーション モジュールは、タスク アイテムの種類が格納されたフォルダーを表示できます。たとえば、人事グループ用のフォルダーには、応募者のグループが共有できる面接の情報を格納できます。

  • [ショートカット] ナビゲーション モジュールは、異なる種類のフォルダーを 1 つのグループとして表示できます。たとえば、人事グループ用のショートカット モジュールは、次の種類のフォルダーをまとめて表示できます。

    • 面接予定者の連絡先。

    • 面接スケジュール用の予定表アイテム。

    • 採用活動に関するタスク。

図 2 は、異なるナビゲーション モジュールの相互関係を表すベン図です。

図 2. Outlook 2007 のナビゲーション モジュール

Outlook 2007 のナビゲーション モジュール

何が問題なのか

開発者が組み込みの Outlook アイテムのいずれの種類にも合致しない新しい構造向けにフォルダーを作成し、エンド ユーザーのシナリオとアクティビティをサポートするためにそれらを Outlook に表示しようとすると、問題が発生します。このようなフォルダーに移動する直観的な方法を提供できません。たとえば、このようなフォルダーには以下のアイテムが格納されると仮定します。

  • 営業グループ用の営業案件の一覧。

  • 人事グループ用の人材募集の一覧。

  • マーケティング グループ用のマーケティング キャンペーンの一覧。

エンド ユーザーは、これらのデータの一覧を既存のナビゲーション モジュール ([フォルダー一覧] を除く) で表示できるとは思いません。開発者は Outlook 2010 のソリューション モジュールを使用して、以下の機能を提供してこの問題を解決できます。

  • 新しいソリューション モジュールを使用して、メール、予定表、連絡先、タスク、メモ、または履歴のいずれのナビゲーション モジュールにも属さないフォルダーを表示します。

  • この新しいカスタムの種類のアイテム用にルート フォルダーと、そのルート フォルダーを整理する際に使用するソリューション モジュール名を指定します。開発者は、SolutionsModule オブジェクトの AddSolution メソッドを使用して、ソリューション モジュールに追加されるソリューションに対応するルート フォルダーを指定できます。AddSolution メソッドの Scope パラメーターを OlSolutionScope.olHideInDefaultModules に設定すると、指定したフォルダーはこの新しい種類として、新しいソリューション モジュールとフォルダー一覧にのみ表示されます。Scope パラメーターを OlSolutionScope.olShowInDefaultModules に設定すると、フォルダーは既存のモジュール、フォルダー一覧、およびソリューション モジュールに表示されます。

図 3 は、Outlook 2010 にソリューション モジュールを追加して更新したベン図です (Scope を olHideInDefaultModules に設定した場合)。

図 3. Outlook 2010 のソリューションとナビゲーション モジュール

Outlook 2010 のソリューションとナビゲーション モジュール

ソリューション モジュールのプログラミング

ソリューション モジュールをナビゲーション ウィンドウに表示するには、アドインで以下の操作を行う必要があります。

  1. SolutionsModule オブジェクトのインスタンスを作成します。

  2. SolutionsModule オブジェクトの AddSolution メソッドを呼び出し、ソリューション ルート フォルダーを表す Folder オブジェクトを渡します。これ以降は、ソリューション ルート フォルダーの下にあるすべてのフォルダーがソリューション モジュールに追加されます。OlSolutionScope 列挙は、ソリューション ルート フォルダーとそのサブフォルダーをナビゲーション ウィンドウ内の既定のモジュールに表示するかどうかを指定します。

  3. 必要であれば、SolutionsModule オブジェクトの Position プロパティを設定して、ソリューション モジュールのボタンがナビゲーション ウィンドウに大きなボタンで表示されるようにします。

サンプル アドイン

この記事には、SolutionsModuleAddinCS という名前のサンプル アドインが付属します。このアドインは Microsoft Visual C# を使用し、実行には Microsoft Visual Studio 2008 Service Pack 1 と Outlook 2010 を必要とします。

インストール手順

サンプル アドインをインストールするには、次の手順に従います。

  1. SolutionsModuleAddinCS.zip ファイルを MSDN Code Gallery (英語) Web サイトからダウンロードします。

  2. .zip ファイルを任意のフォルダーに展開します。Windows Vista では、Visual Studio 2008 プロジェクトの既定のパスは、 C:\Users\user\Documents\Visual Studio 2008\Projects です。

SolutionsModuleAddinCS を実行するには、次の手順に従います。

  1. Outlook を閉じます。

  2. SolutionsModuleAddinCS.zip ファイルを展開したフォルダーで、SolutionsModuleAddinCS ソリューションを開きます。

  3. [ビルド] メニューの [SolutionsModuleAddinCS のビルド] をクリックします。

  4. Outlook を起動して、このアドインを実行モードで起動するか、F5 キーを押してデバッグ モードで起動します。Outlook がデバッグ モードで起動しない場合は、以下の手順を実行します。

デバッグ モードで Outlook を起動するには

  1. ソリューション エクスプローラーで、[SolutionsModuleAddinCS] を選択します。

  2. [プロジェクト] メニューの [SolutionsModuleAddinCS のプロパティ] をクリックし、次に [デバッグ] タブをクリックします。

  3. [開始動作] の [外部プログラムの開始] オプションを選択し、[参照] をクリックします。

  4. [ドライブ:]\Program Files\Microsoft Office\Office14 フォルダーで Outlook.exe をクリックします。

  5. F5 キーを押して、デバッグ モードでアドインを開始します。

コード ウォークスルー

SolutionsModuleAddinCS のコードは簡潔であり、そのスコープは制限されています。唯一の目的はソリューション モジュールをプログラムによって有効にすることであり、ボーナス機能としてソリューション モジュール用のフォルダー アイコンをカスタマイズすることができます。このサンプル コードには EnsureSolutionsModule という 1 つのメソッドがあり、ThisAddin クラスの Startup メソッドからこれが呼び出されます。ソリューション モジュール アドインの Startup メソッドは、一般に Outlook の起動時に実行され、Outlook の最初の実行時やそれ以降の起動時にソリューションが表示されるようにします。

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    // Call EnsureSolutionsModule to ensure that the
    // Solutions module and the custom folder icons
    // appear in the Outlook Navigation Pane.
    EnsureSolutionsModule(); 
}

ソリューションをソリューション モジュールに追加する前に、ソリューション モジュールに表示するフォルダー階層を十分に検討して設計してください。ソリューションのルート フォルダーはソリューション ルート フォルダーと呼ばれ、エンド ユーザーがソリューションを簡単に識別できる名前にする必要があります。1 つのソリューションだけをソリューション モジュールにインストールした場合は、そのソリューション ルート フォルダーの名前がソリューション モジュールのボタンのラベルになります。1 つ以上のソリューションをインストールした場合は、ソリューション モジュールのボタンのラベルは [ソリューション] に戻り、ソリューション モジュールの各ソリューション ルート フォルダーの名前がヒントに表示されます。

EnsureSolutionsModule メソッドでは、ソリューション ルート フォルダーを "Solution Demo" と名付けています。この名前のフォルダーが存在しない場合、rootStoreFolder インスタンス変数が表す既定のストアにこのフォルダーが作成されます。Solution Calendar などの名前でさらにソリューション フォルダーを追加すると、それらは Solution Demo のサブフォルダーとして作成されます。ソリューション ルート フォルダーのすべてのサブフォルダーは、そのソリューション ルート フォルダーの子である必要があります。異なるストア内のフォルダーを含むソリューション ルート フォルダーや、別のソリューション ルート フォルダーの子であるソリューション ルート フォルダーを追加することはできません。ソリューション ルート フォルダーは、個人用フォルダー ファイル (.pst) またはカスタム ストア プロバイダーに格納できます。その場合は, .pst 内またはカスタム ストア内のソリューション ルート フォルダーを表す Folder オブジェクトを取得してください。以下に、EnsureSolutionsModule メソッドの該当部分のコードを示します。

bool firstRun = false ;
Outlook.Folder rootStoreFolder =
    Application.Session.DefaultStore.GetRootFolder()
    as Outlook.Folder;
// If the solution root folder does not exist, create it.
// Note that the solution root 
// could also be in a PST or custom store.
try
{
    solutionRoot =
        rootStoreFolder.Folders["Solution Demo"]
        as Outlook.Folder;
}
catch
{
    firstRun = true;
}

Solution Demo フォルダーが存在しない場合は firstRun 変数を true に設定し、それ以外の場合は false に設定します。どちらの場合も、solutionCalendar、solutionContacts など、インスタンス変数をソリューション ルート フォルダー内の各サブフォルダーを指すように設定します。これらのインスタンス変数は、各ソリューション サブフォルダーとソリューション ルート フォルダーのカスタム フォルダー アイコンを設定するために使用します。

Folder オブジェクトの SetCustomIcon メソッドを使用して、フォルダーにカスタム フォルダー アイコンを設定できます。このカスタム フォルダー アイコンは永続化されないので、アドインが読み込まれるたびに設定する必要があります。また、16 x 16 ピクセルの大きさのアイコン リソースを持つアイコンを IPictureDisp オブジェクトとして設定する必要があります。IPictureDisp オブジェクトをプロセス境界を越えて渡すことはできないので、Outlook のプロセス内で実行されているアドインから SetCustomIcon を呼び出す必要があります。Outlook のプロセス外で実行されているアプリケーションから呼び出した場合、SetCustomIcon はエラーを生成します。アドイン プロジェクトに定義された PictureDispConverter クラスは、アイコン リソースを IPictureDisp オブジェクトに変換します。このクラスは、この記事のソリューション モジュール シナリオとは直接関係ないので、ここでは説明しません。

すべてのフォルダー アイコンを設定した後で、次のコードを使用して、solutionsModule という名前のインスタンス変数を取得します。

// Obtain a reference to the SolutionsModule object.
Outlook.Explorer explorer = Application.ActiveExplorer();
Outlook.SolutionsModule solutionsModule =
    explorer.NavigationPane.Modules.GetNavigationModule(
    Outlook.OlNavigationModuleType.olModuleSolutions)
    as Outlook.SolutionsModule;

Modules オブジェクトの GetNavigationModule メソッドは、olModuleSolutions をモジュールの種類として指定すると、SolutionsModule オブジェクトを返します。次に AddSolution メソッドを呼び出して、ソリューション ルート フォルダーを表す Folder オブジェクトとソリューション ルート フォルダーとそのサブフォルダーを既定のナビゲーション ウィンドウ モジュール (メール、予定表、連絡先、タスクなど) に表示するかどうかを決定する OlSolutionScope 値を渡します。OlSolutionScope が olHideInDefaultModules であれば、ソリューション ルート フォルダーとそのサブフォルダーは、ソリューション モジュールとフォルダー一覧モジュールのみに表示されます。OlSolutionScope が olShowInDefaultModules であれば、ソリューション ルート フォルダーとそのサブフォルダーは、ソリューション モジュール、フォルダー一覧モジュール、およびフォルダーの種類に応じて適切な既定のモジュールに表示されます。たとえば、予定表アイテムの種類のフォルダーは、OlSolutionScope が olShowInDefaultModules である場合に、予定表モジュールにも表示されます。

特定のフォルダーはソリューション ルート フォルダーとして無効であり、そのようなフォルダーを指定して AddSolution メソッドを呼び出すとエラーになります。PST ストアまたはカスタム ストアのルート フォルダーであるフォルダーが有効なソリューション ルート フォルダーであることに注意してください。次のフォルダーは、有効なソリューション ルート フォルダーです。

  • 既定のフォルダーまたは特別なフォルダー。既定のフォルダーは OlDefaultFolders 列挙で表され、特別なフォルダーは OlSpecialFolders 列挙で表されます。

  • 別のソリューションのソリューション ルート フォルダーに既になっているフォルダー。

  • 既存のソリューション ルート フォルダーのサブフォルダーであるフォルダー。

  • 既存のソリューション ルート フォルダーの親フォルダーであるフォルダー。

次のコード例では、AddSolution メソッドを呼び出して、ソリューション モジュールとフォルダー一覧モジュールのみに表示されるソリューション ルート フォルダーを指定します。

// Add the solution and hide folders in default modules.
solutionsModule.AddSolution(solutionRoot,
    Outlook.OlSolutionScope.olHideInDefaultModules);

最後に、ナビゲーション ウィンドウに表示するソリューション モジュール ボタンの位置とサイズを制御します。SolutionsModule オブジェクトの Visible、Position、および DisplayedModuleCount プロパティを使用して、ソリューション モジュールのボタンの表示と非表示、位置、およびサイズを指定します。DisplayedModuleCount が SolutionsModule オブジェクトの Position プロパティよりも小さい場合は、モジュール ボタンは大きなボタンではなく小さなボタンで表示されます。

// The following code sets the position and visibility
// of the Solutions module.
if (solutionsModule.Visible == false)
{
    // Set Visibile to true.
    solutionsModule.Visible = true;
}
if (solutionsModule.Position != 5)
{
    // Move SolutionsModule to Position = 5.
    solutionsModule.Position = 5;
}
// Create an instance variable for the Navigation Pane.
Outlook.NavigationPane navPane = explorer.NavigationPane;
if (navPane.DisplayedModuleCount != 5)
{
    // Ensure that the Solutions module button is large.
    navPane.DisplayedModuleCount = 5;
}

EnsureSolutionsModule メソッドの全体を詳しく調べる必要がある場合のために、以下にこのメソッドの完全なコード リストを示します。

private void EnsureSolutionsModule()
{
    try
    {
        // Declarations.
        Outlook.Folder solutionRoot;
        Outlook.Folder solutionCalendar;
        Outlook.Folder solutionContacts;
        Outlook.Folder solutionTasks;
        bool firstRun = false ;
        Outlook.Folder rootStoreFolder =
            Application.Session.DefaultStore.GetRootFolder()
            as Outlook.Folder;
        // If the solution root folder does not exist, create it.
        // Note that the solution root 
        // could also be in a PST or custom store.
        try
        {
            solutionRoot =
                rootStoreFolder.Folders["Solution Demo"]
                as Outlook.Folder;
        }
        catch
        {
            firstRun = true;
        }

        if (firstRun == true)
        {
            solutionRoot =
                rootStoreFolder.Folders.Add("Solution Demo",
                Outlook.OlDefaultFolders.olFolderInbox) 
                as Outlook.Folder;
            solutionCalendar = solutionRoot.Folders.Add(
                "Solution Calendar", 
                Outlook.OlDefaultFolders.olFolderCalendar)
                as Outlook.Folder;
            solutionContacts = solutionRoot.Folders.Add(
                "Solution Contacts", 
                Outlook.OlDefaultFolders.olFolderContacts)
                as Outlook.Folder;
            solutionTasks = solutionRoot.Folders.Add(
                "Solution Tasks", 
                Outlook.OlDefaultFolders.olFolderTasks)
                as Outlook.Folder;
        }
        else
        {
            solutionRoot =
                rootStoreFolder.Folders["Solution Demo"]
                as Outlook.Folder;
            solutionCalendar = solutionRoot.Folders[
                "Solution Calendar"]
                as Outlook.Folder;
            solutionContacts = solutionRoot.Folders[
                "Solution Contacts"]
                as Outlook.Folder;
            solutionTasks = solutionRoot.Folders[
                "Solution Tasks"]
                as Outlook.Folder;
        } 
        // Get the icons for the solution.
        stdole.StdPicture rootPict = 
            PictureDispConverter.ToIPictureDisp(
            Properties.Resources.BRIDGE)
            as stdole.StdPicture;
        stdole.StdPicture calPict = 
            PictureDispConverter.ToIPictureDisp(
            Properties.Resources.umbrella)
            as stdole.StdPicture;
        stdole.StdPicture contactsPict = 
            PictureDispConverter.ToIPictureDisp(
            Properties.Resources.group)
            as stdole.StdPicture;
        stdole.StdPicture tasksPict = 
            PictureDispConverter.ToIPictureDisp(
            Properties.Resources.SUN)
            as stdole.StdPicture;
        // Set the icons for the solution folders.
        solutionRoot.SetCustomIcon(rootPict);
        solutionCalendar.SetCustomIcon(calPict);
        solutionContacts.SetCustomIcon(contactsPict);
        solutionTasks.SetCustomIcon(tasksPict);
        // Obtain a reference to the Solutions module.
        Outlook.Explorer explorer = Application.ActiveExplorer();
        solutionsModule =
            explorer.NavigationPane.Modules.GetNavigationModule(
            Outlook.OlNavigationModuleType.olModuleSolutions)
            as Outlook.SolutionsModule;
        // Add the solution and hide folders in default modules.
        solutionsModule.AddSolution(solutionRoot, 
            Outlook.OlSolutionScope.olHideInDefaultModules);
        // The following code sets the position and visibility
        // of the Solutions module.
        if (solutionsModule.Visible == false)
        {
            // Set Visibile to true
            solutionsModule.Visible = true;
        }
        if (solutionsModule.Position != 5)
        {
            // Move SolutionsModule to Position = 5
            solutionsModule.Position = 5;
        }
        // Create an instance variable for the Navigation Pane.
        Outlook.NavigationPane navPane = explorer.NavigationPane;
        if (navPane.DisplayedModuleCount != 5)
        {
            // Ensure that the Solutions module button is large.
            navPane.DisplayedModuleCount = 5;
        }
    }
    catch (Exception ex)
    {
        Debug.Write(ex.Message);
    }
}

その他の注意事項

アプリケーションの開発時にソリューション モジュールを設計する際には、以下に示すソリューション モジュールのその他の特性についても注意してください。

  • AddSolution メソッドを呼び出すときに Scope パラメーターに olShowInDefaultModules を指定した場合は、メール アイテムが含まれるソリューション フォルダーをメール モジュールの [お気に入りのフォルダー] の一覧に追加できます。[お気に入りのフォルダー] の一覧に追加できるのは、メール フォルダーだけです。

  • エンド ユーザーがソリューション モジュールに移動し、ソリューション モジュール内のソリューション フォルダーを現在のフォルダーにした場合、いったん別の場所に移動してから再びソリューション モジュールに移動すると、このフォルダーに戻ります。ただし、ソリューション モジュールの現在のフォルダー設定は、Outlook セッション間で維持されません。

まとめ

ソリューション モジュールは、Outlook 2010 のユーザー インターフェイスの重要な要素を開発者に提供します。Outlook では 1 つのソリューション モジュールだけですべてのソリューションをサポートしますが、開発者はソリューション モジュールを使用して、Outlook の以前のバージョンでは不可能だった方法で独自のソリューションを Outlook のナビゲーション ウィンドウにシームレスに統合できます。

その他の技術情報

詳細については、次のリソースを参照してください。