Windows 7
ハンズオン ラボ: Windows 7 タスク バー

更新日: 2009 年 10 月 23 日


ハンズオンラボ

ダウンロード

目次

  1. 演習: WINDOWS 7 タスク バー
  2. 練習 1: ジャンプ リストの統合

    タスク 1 – ファイルの関連付けを登録する
    タスク 2 – ジャンプ リストの「最近使ったもの」に追加する
    タスク 3 – ジャンプ リストにタスクとデスティネーションを追加する

  3. 練習 2: サムネイルのカスタマイズ

    タスク 1 – サムネイル クリッピングを使用する
    タスク 2 – カスタム サムネイルを利用する

  4. 練習 3: タスク バーでの進行状況と状態

    タスク 1 – オーバーレイ アイコンを表示する
    タスク 2 – タスク バーのプログレス バーを使用する

  5. まとめ

このドキュメントに記載されている情報 (URL 等のインターネット Web サイトに関する情報を含む) は、将来予告なしに変更することがあります。このドキュメントに記載された内容は情報提供のみを目的としており、明示または黙示に関わらず、これらの情報についてマイクロソフトはいかなる責任も負わないものとします。

お客様が本製品を運用した結果の影響については、お客様が負うものとします。お客様ご自身の責任において、適用されるすべての著作権関連法規に従ったご使用を願います。このドキュメントのいかなる部分も、米国 Microsoft Corporation の書面による許諾を受けることなく、その目的を問わず、どのような形態であっても、複製または譲渡することは禁じられています。ここでいう形態とは、複写や記録など、電子的な、または物理的なすべての手段を含みます。

マイクロソフトは、このドキュメントに記載されている内容に関し、特許、特許申請、商標、著作権、またはその他の無体財産権を有する場合があります。別途マイクロソフトのライセンス契約上に明示の規定のない限り、このドキュメントはこれらの特許、商標、著作権、またはその他の無体財産権に関する権利をお客様に許諾するものではありません。

別途記載されていない場合、このソフトウェアおよび関連するドキュメントで使用している会社、組織、製品、ドメイン名、電子メール アドレス、ロゴ、人物、出来事などの名称は架空のものです。実在する会社名、組織名、商品名、個人名などとは一切関係ありません。

© 2009 Microsoft Corporation. All rights reserved.

Microsoft、MS-DOS、Windows、Windows NT、MSDN、Active Directory、BizTalk、Windows Server、SQL Server、SharePoint、Outlook、PowerPoint、FrontPage、Visual Basic、Visual C++、Visual C#、Visual Studio は、米国 Microsoft Corporation の米国およびその他の国における登録商標または商標です。

記載されている会社名、製品名には、各社の商標のものもあります。

ページのトップへ


1. 演習: Windows 7 タスク バー

新しい Windows 7 のタスク バーは、Windows 上でアプリケーションを起動する操作性の革命であり、長年の進化の成果です。この新しいタスク バーは、次に挙げる多くのエンド ユーザーのシナリオについて、効率化を図ります。

  • アプリケーションを起動する
  • 複数のアプリケーションや、1 つのアプリケーションの中の複数のウィンドウの間を切り替える
  • 最近使用したドキュメントやよく使うドキュメントの一覧を管理する
  • よく使うアプリケーション タスクを起動する
  • タスク バー ボタンを通じて、処理の進行状況や状態の通知を行う
  • タスク バーのサムネイルから離れずに、アプリケーションを制御する

この新しいタスク バーは、Windows 7 上でアプリケーションを引き立たせる、他にはない機会です。これは、エンド ユーザーが処理を起動し制御するための主要な接点です。それだけに、新しいタスク バーの機能を、Windows 7 向けアプリケーションに取り入れることは、非常に重要です。

この新しいタスク バーのユーザー インターフェイスに機能を統合した設計意図としては、Windows へより簡潔な見栄えを提供することや、ユーザーがシステムと対話するための学習量を軽減すること、また、主機能やタスク、目的のファイルなどを見つけやすくすること、そして、エンド ユーザーの一般的なシナリオをより扱いやすくすることなどが挙げられます。

前提知識

この演習のドキュメントでは、次に挙げる知識を既にお持ちであることを前提に解説しています。ただし、C# の言語文法等に自信のない方でも、この演習付属のサンプルの完成品をコンパイルし、実行することで、この演習で取り上げた機能を体感することができます。

  • Visual Studio 2008 (Visual C# 2008) における基本的な操作。たとえば、ソリューションを開く方法、コードの編集、ビルド (コンパイル) や実行方法など。
  • C# の言語文法や、オブジェクト指向プログラミングに関する基本的な用語。

演習のシステム要件

この演習を行うには、あらかじめ以下の環境を用意する必要があります。

  • Windows 7 (日本語 32 ビット版)
  • Windows Areo をフルサポートするグラフィックス カード
  • Visual C# 2008 SP1 (Visual Studio 2008 SP1) 日本語版、Express Edition も可能
  • Windows API Code Pack 1.0 (Windows API Code Pack for Microsoft .NET Framework)
  • この演習で使用する付属のソース プログラム (サンプル プログラム)

この後は、上記の各項について、留意点をいつくか補足します。予めご覧ください。

Windows 7 では Visual Studio 2008 を動作させることが目的なので、特に Windows 7 のエディションは問いません。

この演習では、タスク バーのサムネイルに、コンテンツを表示するサムネイル プレビュー (ライブ サムネイル) を使用するので、Windows Aero に対応したグラフィックス環境が必要です。

Visual C# 2008 のエディションは問いません。Visual C# 2008 Express Edition も演習を行うことが可能です。ただし、SP 1 をご利用ください。今回インストールする Windows API Code Pack 1.0 は、.NET Framework 3.5 SP1 が前提になります。なお、Visual C# 2008 Express Edition は、Visual Studio 2008 Express Edition SP1 の一部として、以下の URL のダウンロードセンターから無償で入手できます。(2009 年 9 月現在)

http://www.microsoft.com/downloads/search.aspx?displaylang=ja

この演習で使用する Windows API Code Pack 1.0 は、マネージ コードから Windows 7 の新機能を利用するための、ソース コード ライブラリです。Windows API Code Pack 1.0 は、MSDN Code Gallery の中の、以下の URL から入手することができます。

WindowsAPICodePack Windows API Code Pack ホーム: http://code.msdn.microsoft.com/WindowsAPICodePack/ (英語)

Window API Code Pack ダウンロード用のページ: http://code.msdn.microsoft.com/WindowsAPICodePack/Release/ProjectReleases.aspx?ReleaseId=30772 (英語)

この Windows API Code Pack 1.0 を演習で使用するための準備方法については、後述の「Windows API Code Pack 1.0 の基本的な準備」、および、「Windows API Code Pack 1.0 の演習のための準備」の項を参照してください。

演習に使用する付属のソース プログラムの入手方法については、このドキュメントを入手されたサイト等でご確認ください。ソース プログラムの使用方法は、後述の「演習で使用する付属のソース プログラム (サンプル プログラム) のインストール方法」の項を参照してください。

Windows API Code Pack 1.0 の基本的な準備

Windows API Code Pack は、ソース コードとして提供されます。これを使用するには、コンパイルしてアセンブリを作る必要があります。演習を行うためには、次の操作でアセンブリを用意します。

  1. ダウンロード サイトから、WindowsAPICodePack.zip を入手できたことを確認します。
  2. WindowsAPICodePack.zip の中に含まれる WindowsAPICodePack フォルダーを解凍して取り出し、適当な場所に置きます。(ここでは、C:\ の直下にこのフォルダーを置くことにします。)
  3. 以下のパスにあるソリューション ファイルをダブルクリックして、 Visual Studio 2008 から開きます。 C:\WindowsAPICodePack\WindowsAPICodePack\WindowsAPICodePack.sln
  4. ソリューションが開いたら、[ビルド] メニューの [ソリューションのビルド] をクリックして、ソリューション全体をビルドします。
  5. ビルドが済んだ後、次に示すパスに、2 つのアセンブリがあることを確認します。
    パス: C:\WindowsAPICodePack\WindowsAPICodePack\Shell\bin\Debug
    アセンブリ: Microsoft.WindowsAPICodePack.dll、および
    Microsoft.WindowsAPICodePack.Shell.dll
Note: 上記の 2 つのアセンブリは、Windows API Code Pack を使用して、Windows 7 タスク バーを使用する際に必要になります。ここまでの手順は、この演習に限らず、Windows API Code Pack を使用する場合に必要な手順です。さらに実際に使用するには、使用する側のプロジェクトに、これらのアセンブリへの参照を追加する必要があります。
なお、このソリューションの既定の Debug 版のビルドを行いましたが、運用環境で使用するならば、Release 版用のビルドを行うことになります。

演習で使用する付属のソース プログラム (サンプル プログラム) のインストール方法

演習で使用するソース プログラムには、特別なインストール方法はありません。入手されたソース プログラムのフォルダー「HOLTaskbar」全体を、任意のパスにコピーしてください。たとえば、C:\ にコピーすれば、演習で作業を行うソース プログラムのパスは、次のようになります。

例1. C:\HOLTaskbar

なお、演習の本文では、ソース プログラム等の位置を示す際、次のように、ソース プログラムのルート フォルダーに対する相対パスで表記しています。

例2. Ex1_Starter\ Ex1_Starter.sln

この場合、ソース プログラムのフォルダーが例 1 の場所であるなら、絶対パスは次の意味になります。

例3. C:\HOLTaskbar\Ex1_Starter\Ex1_Starter.sln

なお、演習作業の中で、ソース プログラムに書き込む場合もあるので、作業を行うユーザー アカウントには、ソース プログラムに対して、書き込み可能なアクセス許可を与えてください。

Windows API Code Pack の演習のための準備

この演習では、Windows API Code Pack が提供するライブラリのほか、いくつかの付属サンプルも流用します。この後の作業を行いやすくするため、これら必要なファイルを別の場所にコピーしておくことにします。

  1. 演習用フォルダー HOLTaskbar の中に、dependencies サブ フォルダーがあることを確認します。たとえば、演習用フォルダーが C:\ にあれば、dependencies サブ フォルダーは次のパスになります。

    C:\HOLTaskbar\dependencies

  2. 前述のパスに、次に挙げるファイル、およびフォルダーをすべてコピーします。
    1. Microsoft.WindowsAPICodePack.dll、Microsoft.WindowsAPICodePack.Shell.dll
      (ライブラリの本体の一部であり、「Windows API Code Pack 1.0 の基本的な準備」でビルドしたアセンブリです。)
    2. 以下のパスにある RegistrationHelper フォルダー全体
      C:\WindowsAPICodePack\Samples\Shell\TaskbarDemo\CS\RegistrationHelper
      (RegistrationHelper の中には、RegistrationHelper プロジェクトがあります。この Registration フォルダーが dependencies サブ フォルダーの直下になるようにコピーします。)
    3. 以下のパスにある RegistrationHelper.cs
      C:\WindowsAPICodePack\Samples\Shell\TaskbarDemo\CS\TaskbarDemo
      (フォルダー名を間違いないようにしてください。TaskbarDemo フォルダーにある RegistrationHelper.cs ファイルを dependencies サブ フォルダーの直下になるようにコピーします。)
Note: 前述の b と c は、Windows API Code Pack のライブラリ本体ではなく、付属のサンプルですが、タスク バーに表示された特定のアプリケーションのジャンプ リストと、拡張子との間を関連付ける便利なヘルパー メソッドがあるので、この演習の一部の手順で利用することにします。

演習の目的

このハンズオンでは、Windows API Code Pack を使用して、.NET 対応アプリケーションから、以下に挙げる Windows 7 のタスク バーの様々な機能を利用します。

  • アプリケーションのジャンプ リストの中に、デスティネーションとタスクについて、標準のもの、およびカスタマイズされたものを組み込む
  • より有効なサムネイル プレビューをアプリケーションに提供する
  • アプリケーションのタスク バー ボタンを介して、進行状況や状態の通知を伝えるようにする
Note: この演習に示すように、アプリケーションのプレゼンテーション層にロジックを混在させることは、ソフトウェア エンジニアリングにおける悪い実践例です。このようにすると、テストが困難になり、問題点が複雑化し、他の多くの強固なデザイン指針に反するものです。
ここでは、出来る限り実装を簡単にするため、このアプローチを選択しました。現実のアプリケーションにおいて、Windows 7 のタスク バー機能を使用する場合は、既存のアプリケーション デザインに適切に組み込むために、相応の時間が必要です。

ページのトップへ


2. 練習 1: ジャンプ リストの統合

この練習では、Windows 7 タスク バーの一部である、新しいジャンプ リストの機能を、アプリケーションに統合します。まず、コモン ダイアログ ボックスや明示的に API を使用して、アプリケーション デスティネーション (アプリケーションの対象となるドキュメント) を、そのアプリケーションのジャンプ リストの「最近使ったもの」カテゴリに追加します。また、そのアプリケーション用のカスタム カテゴリを追加します。そして、ユーザーがそのアプリケーションを使用する際に役立つ、カスタム タスクを追加します。

この練習で使用するサンプル アプリケーションは、リッチ テキスト形式 (RTF) のデータを読み取るドキュメント リーダーであり、一度に 1 つの RTF ドキュメントを表示できます。この練習で使用する手法は、ドキュメントに関連付ける、いずれのアプリケーションにも適用できます。

ページのトップへ

タスク 1 - ファイルの関連付けを登録する

Windows シェルのインフラストラクチャのもとで、アプリケーションのジャンプ リストが適切に動作するためには、そのアプリケーションがサポートするドキュメントのファイル拡張子を、登録する必要があります。

  1. 演習用フォルダー (HOLTaskbar) の中の、以下のパスにあるソリューション ファイルを、Visual Studio 2008 で開きます。

    Ex1_Starter\ Ex1_Starter.sln

  2. 最初に行うべき手順は、Windows API Code Pack 1.0 に含まれるライブラリを使用できるようにするため、必要なアセンブリへの参照を、プロジェクトに追加することです。次の要領で行います。
    1. 演習用フォルダーの中の dependencies サブ フォルダー (HOLTaskbar\dependencies) に、次のアセンブリがあることを確認します。(既に「Windows API Code Pack 1.0 の基本的な準備」の項の手順に基づいて、dependenciesサブ フォルダーに配置してあるはずです。)

      Microsoft.WindowsAPICodePack.dll
      Microsoft.WindowsAPICodePack.Shell.dll

    2. ソリューション エクスプローラー上で、Ex1_Starter プロジェクト内の [参照設定] ノードを右クリックして、[参照の追加] メニューをクリックします。
    3. [参照の追加] ダイアログ ボックスが表示されたら、[参照] タブをクリックします。
    4. 前述の dependencies サブ フォルダーにある Microsoft.WindowsAPICodePack.dll およびMicrosoft.WindowsAPICodePack.Shell.dll の 2 つのアセンブリを選択します。
      二つのアセンブリを選択します。
    5. [OK] をクリックし、[参照の追加] ダイアログ ボックスを閉じます。
    6. ソリューション エクスプローラーの [参照設定] ノードの配下に、前述の 2 つのアセンブリが追加されたことを確認します。
      二つのアセンブリが追加されたことを確認します。
      Note: Windows API Code Pack に含まれるタスク バー関連のライブラリを使用するには、上記のアセンブリで十分です。しかし、ここでは拡張子の関連付けのために、Windows API Code Pack 付属のサンプル ソース プログラムも使用するので、次の手順 3 と 4 も行ってください。
  3. 次に示す手順に従って、演習用フォルダー内の dependencies サブ フォルダーにある RegistrationHelper プロジェクトをソリューションに含めた上で、参照を追加します。(既に Windows API Code Pack の演習のための準備」の項の手順に基づいて、dependenciesサブ フォルダーに RegistrationHelper プロジェクトが配置してあるはずです。)
    1. ソリューション エクスプローラー上のルートノードを右クリックし、ショートカット メニューを表示させ、[追加]、[既存のプロジェクト] の順にクリックします。
    2. [既存のプロジェクトの追加] ダイアログ ボックスが開いたら、次のパスのプロジェクトを選択し、[開く] ボタンをクリックします。
      \dependencies\RegistrationHelper\RegistrationHelper.csproj
    3. 次図のように、ソリューション エクスプローラーには、RegistrationHelper プロジェクトが追加されたことを確認します。
      RegistrationHelper プロジェクトが追加されたことを確認します。
    4. ここで、RegistrationHelper プロジェクトへの参照を、Ex1_Starter プロジェクト側に追加するので、Ex1_Starter プロジェクト配下の [参照設定] ノードを右クリックして、[参照の追加] メニューをクリックします。
    5. [参照の追加] ダイアログ ボックスが表示されたら、[プロジェクト] タブをクリックします。
    6. RegistrationHelper プロジェクトを選択し、[OK] をクリックして、[参照の追加] ダイアログ ボックスを閉じます。
    7. 次図のように、Ex1_Starter プロジェクトの [参照設定] ノードに、RegistrationHelper プロジェクトが追加されたことを確認します。
      RegistrationHelper プロジェクトが追加されたことを確認します。
  4. 次に、Windows API Code Pack の別のサンプル ソース ファイルを、Ex1_Starter プロジェクトに追加します。次の要領で行ってください。(既に Windows API Code Pack の演習のための準備」の項の手順に基づいて、dependenciesサブ フォルダーには、ソース ファイル RegistrationHelper.cs が配置してあるはずです。)

    1. ソリューション エクスプローラーの Ex1_Starter プロジェクトを右クリックし、ショートカット メニューを表示させ、[追加]、[既存の項目] の順にクリックします。
    2. [既存項目の追加] ダイアログ ボックスが表示されたら、次のパスのソース ファイルを選択し、[追加] ボタンをクリックします。
      \dependencies\RegistrationHelper.cs
    3. 次図のように、Ex1_Starter プロジェクトに RegistrationHelper.cs が追加されたことを確認します。
      RegistrationHelper.cs が追加されたことを確認します。
      Note: プロジェクト単位で参照を追加した RegistrationHelper プロジェクトは、dependencies サブ フォルダーにあるものをそのまま参照していますが、ソース ファイル単位で追加した RegistrationHelper.cs は Ex1_Starter プロジェクト側にコピーされています。

    これで、演習で必要なファイルを使用する準備ができました。この後は、具体的な実装を行います。

  5. Ex1_Starter プロジェクトの DocumentReader.cs ファイルをコード エディターで開き、先頭部分の、名前空間を使用する既存の using ブィレクティブ (using System.IO;) の下に、今回使用するライブラリの名前空間を使用する using ディレクティブを追加します(黄色の部分)。
...(省略)
using System.Reflection;
using System.IO;
using Microsoft.WindowsAPICodePack.Taskbar;
  1. DocumentReader.cs ファイルをコード エディターで開き、DocumentReader_Load メソッドの先頭に移動し、次のように、このメソッドの外側で、TaskbarManger のインスタンスを初期値とするメンバー変数 taskbarManager を宣言します。また、このメソッドの中で、TaskbarManager インスタンスのアプリケーション ID (ApplicationID プロパティ) として、定数 APP_ID を設定します。
private const string APP_ID = "WindowsSeven.Ex1_DocumentReader";
private TaskbarManager taskbarManager = TaskbarManager.Instance;
        
private void DocumentReader_Load(object sender, EventArgs e)
{
    taskbarManager.ApplicationId = APP_ID;
  1. 今回使用するサンプル RegistrationHelper のため、次の名前空間の using ディレクティブを、他の using ディレクティブの下に追加します。
...
using Microsoft.WindowsAPICodePack.Taskbar;
using TaskbarDemo;
  1. [Register Association] ボタンのイベント ハンドラ (btnRegisterAssociation_Click メソッド) の中に、RegistrationHelper クラスを使用して、このアプリケーションと拡張子 .rtf との関連付けを登録する次のコードを記述します。
private void btnRegisterAssociation_Click(object sender, EventArgs e)
{
    RegistrationHelper.RegisterFileAssociations(
        APP_ID, false, taskbarManager.ApplicationId,
        Assembly.GetExecutingAssembly().Location + " /doc:%1",
        ".rtf");
   }
  1. これで、フォーム上の [Register Association] ボタンを使用して、このアプリケーション向けにファイルの関連付けを登録できるようになります。ここで、このアプリケーションを起動して、[Register Association] ボタンをクリックしてください。
  2. ユーザー アカウント 制御が有効な環境では、レジストリの変更を許可するかを問うプロンプトが表示されるので、[はい] をクリックして続行します。コマンド プロンプトが一時的に表示され、登録用のユーティリティが起動し、ファイルの関連付けが登録されます。
  3. 関連付けが済んだら、アプリケーションを終了しておきます。
Note: 登録を解除するために、RegistrationHelper クラスには、UnregisterFileAssociations メソッドが用意されています。ここでは、簡単にするため、登録だけを行うことにします。

ページのトップへ


タスク 2 – ジャンプ リストの「最近使ったもの」に追加する

Windows のコモン ファイル ダイアログは、Shell ライブラリをサポートするためにWindows 7 において更新されました。コモン ファイル ダイアログでドキュメントを選択すると、そのダイアログを呼び出したアプリケーションに対応するジャンプ リストの「最近使ったもの」一覧に、そのドキュメントが追加されます。ここでは、「最近使ったもの」に追加するために、コモン ダイアログを使用する方法と、API を使用する方法を確認します。

  1. [Open] ボタンのイベント ハンドラ (btnOpen_Click メソッド) の中で、OpenFileDialog クラスを用いて、ユーザーにファイル名を入力するように問い合わせ、さらに、選択したファイル名を、フォーム上の RichTextBox (rtbText) の Load メソッドに引数として渡し、ファイルを読み込みます。このイベント ハンドラは、次のようなコードになります。
private void btnOpen_Click(object sender, EventArgs e)
{
    OpenFileDialog ofd = new OpenFileDialog();
    if (ofd.ShowDialog() != DialogResult.OK)
       return;
    rtbText.LoadFile(ofd.FileName);
}
  1. アプリケーションを起動して、この新しい機能をテストします。

    1. タスク バー上にある、このアプリケーションのアイコンを右クリックして、ジャンプ リストの現在の状態を調べ、ジャンプ リストのカテゴリには、ドキュメントが表示されていないことを確認します。
      ジャンプリストのカテゴリには、ドキュメントが表示されていないことを確認します。
    2. [Open] ボタンをクリックして [開く] ダイアログ ボックスを表示させ、演習用のフォルダー (HOLTaskbar) の直下にある以下 RTF ドキュメントを読み込みます。

      Document1.rtf

    3. ドキュメントを読み込んだ後、このアプリケーションのタスク バー ボタンを右クリックして、ジャンプ リストの中の「最近使ったもの」カテゴリに、そのドキュメントの名前が表示されていることを確認します。
      ドキュメントの名前が表示されていることを確認します。
    4. アプリケーションを終了します。
    Note: この時点では、「最近使ったもの」に明示的に追加する API を使用していません。コモン ダイアログで選択したものが、自動的に「最近使ったもの」に追加されました。ただし、この自動的な追加の仕組みを利用するには、予めタスク 1 で行ったように、このアプリケーションと拡張子を関連付けておく必要があります。

    もし、ユーザー インターフェイスにファイルを選択する際に、異なる仕組みを使用しているならば、プログラム コードを使って、最近の一覧を直接制御したくなるでしょう。次に、API を使用して、「最近使ったもの」へドキュメントを追加する方法を確認します。

  2. DocumentReader.cs の中の DocumentReader_Load メソッドの先頭に移動し、次のように、JumpList クラスのインスタンス用のメンバー変数を定義します。
private const string APP_ID = "WindowsSeven.Ex1_DocumentReader";
private TaskbarManager taskbarManager = TaskbarManager.Instance;
private JumpList jumpList = null;
private void DocumentReader_Load(object sender, EventArgs e)
{
  ...
  1. DocumentReader.cs の、DocumentReader_Shown イベント ハンドラの中に、次のように JumpList インスタンスを作成し、メンバー変数 jumpList に設定するコードを追加します。
private void DocumentReader_Shown(object sender, EventArgs e)
{
    jumpList = JumpList.CreateJumpList();
}
  1. [Add Recent] ボタンのイベント ハンドラ (btnAddRecent_Click メソッド) の中で、次のように JumpList インスタンスの AddToRecent メソッドを使用して「最近使ったもの」カテゴリに、項目を追加します。
private void btnAddRecent_Click(object sender, EventArgs e)
{
    jumpList.AddToRecent(@"C:\HOLTaskbar\Document2.rtf");
}
  1. 再び、アプリケーションを起動します。
    1. このアプリケーションのジャンプ リスト上で、「最近使ったもの」カテゴリの中に、Document2.rtf がある場合は、このドキュメントを右クリックし、[この一覧から削除] をクリックして、一覧から削除します。
    2. アプリケーションの [Add Recent] ボタンをクリックします。
    3. ジャンプ リストの「最近使ったもの」カテゴリに、Document2.rtf が追加されたことを確認します。
      Document2.rtf が追加されたことを確認します。
    4. アプリケーションを終了します。
  2. ジャンプ リスト上でドキュメントをクリックしたとき、今のところ、そのドキュメントのコンテンツは無視して、アプリケーションが再起動します。ファイルの関連付けを登録してあると、ドキュメントのショートカットから起動したとき、そのドキュメントのファイル名に、/doc フラグを付けてアプリケーションを起動するように、Shell に要求したことになります。次のコードを DocumentReader_Load メソッド内部の最後に追加し、アプリケーションのコマンドライン引数を読み取り、要求されたドキュメントを RichTextBox に読み込むようにします。
if (Environment.CommandLine.Contains("/doc"))
{
    string doc = Environment.CommandLine.Substring(
        Environment.CommandLine.IndexOf("/doc") + "/doc".Length+1);
    rtbText.LoadFile(doc);
}
  1. アプリケーションを再び起動し、ジャンプ リストの 「最近使ったもの」カテゴリの中のドキュメントの 1 つをクリックします。すると、もう 1 つ同じアプリケーションが起動し、フォームにはそのドキュメントがロードされて表示されるはずです。確認が済んだら、アプリケーションを終了します。

ページのトップへ


タスク 3 – ジャンプ リストにタスクとデスティネーションを追加する

ここまでは、ジャンプ リストがサポートする予め用意された機能を確認しました。このタスクでは、アプリケーションのユーザー エクスペリエンスをより向上させるため、ジャンプ リストをカスタマイズし、独自のタスクと、独自にカテゴリ分けしたデスティネーションを追加します。

  1. この後にジャンプ リストに追加するタスクでは、アイコンを表示させるので、必要とする IconReference クラスの名前空間 Microsoft.WindowsAPICodePack.Shell のために、次の using ディレクティブを、他の using ディレクティブを記述した場所に追加します。
...
using Microsoft.WindowsAPICodePack.Taskbar;
using Microsoft.WindowsAPICodePack.Shell;
using TaskbarDemo;
  1. DocumentReader_Shown イベント ハンドラの中で、JumpList インスタンスを作成した後、メモ帳を起動するタスクをジャンプ リストに追加するため、コードを次の要領で記述します。(このイベント ハンドラの完成コードは、次に提示してあります。)
    1. メモ帳が存在するシステム パスを求めるため、次のコード例のように、Environment クラスの GetFolderPath メソッドを呼び出してパスを求め、変数 systemFolder に代入します。
    2. ジャンプ リスト上に表示されるアイコン付きのメモ帳 (notepad.exe) へのリンクに当たる JumpListLink インスタンスを作成し、これを引数にして jumpList インスタンスの AddUserTasks メソッドを呼び出します。
    3. jumpList インスタンスの KnownCategoryToDisplay プロパティには、「最近使ったもの」が表示されるように、JumpListKnownCategoryType.Recent を設定します。
    4. ジャンプ リストを更新するため、Refresh メソッドを呼び出します。
private void DocumentReader_Shown(object sender, EventArgs e)
{
    jumpList = JumpList.CreateJumpList();
    string systemFolder 
        = Environment.GetFolderPath(Environment.SpecialFolder.System);
    jumpList.AddUserTasks(
        new JumpListLink(Path.Combine(systemFolder, "notepad.exe"),
                         "Open Notepad")
           {
                IconReference = new IconReference(
                    Path.Combine(systemFolder, "notepad.exe"), 0)
           }
    );
    jumpList.KnownCategoryToDisplay = JumpListKnownCategoryType.Recent;
    jumpList.Refresh();
}
  1. ここでアプリケーションを起動して、ジャンプ リストを確認します。
  2. ジャンプ リストの「タスク」カテゴリに、メモ帳を起動するショートカットがあることを確認します。
    メモ帳を起動するショートカットがあることを確認します。
  3. このショートカットをクリックして、メモ帳を起動します。
  4. 確認が済んだら、メモ帳と演習のアプリケーションを終了します。

    次に、ジャンプ リストに、カスタム カテゴリに含まれるカスタム デスティネーションを追加します。ユーザーがドキュメントを最近開いてなくとも、このアプリケーションのデスティネーションの一覧に追加するようにします。

  5. 前述の DocumentReader_Shown イベント ハンドラの中で、タスクを追加した後に (つまり、KnownCategoryToDisplay プロパティを設定する前に)、デスティネーションを追加するための、次の要領でコードを追加します。(追加したコードは、この後にあります。)
    1. カスタム カテゴリのための JumpListCustomCategory インスタンスを作成します。コンストラクターの引数には、カテゴリ名として「Interesting」を渡します。
    2. カテゴリ内のデスティネーションとして Document3.rtf を追加するため、JumpListItem インスタンスを作成し、JumpListCustomCategory インスタンスの AddJumpListItems メソッドを呼び出して、これを追加します。
    3. 手順 a で作成してカテゴリをジャンプ リストに追加するため、jumpList インスタンスの AddCustomCategories メソッドを呼び出します。
private void DocumentReader_Shown(object sender, EventArgs e)
{
  ... (省略)
    JumpListCustomCategory category
        = new JumpListCustomCategory("Interesting");
    category.AddJumpListItems(
        new JumpListItem(@"C:\HOLTaskbar\Document3.rtf"));
    jumpList.AddCustomCategories(category);
    jumpList.KnownCategoryToDisplay = JumpListKnownCategoryType.Recent;
    jumpList.Refresh();
}
  1. 再び、アプリケーションを実行します。ジャンプ リストには、新しいカテゴリ (この例では「Interesting」) が表示され、指定されたドキュメント (この例では「Document3.rtf」) が表示されることが分かります。
    指定されたドキュメント (この例では「Document3.rtf」)が表示されることが分かります。
  2. 確認が済んだら、アプリケーションを終了します。

この練習では、ジャンプ リストに関して「最近使ったもの」に関する予め用意された機能を使用したほか、カスタムタスクや、カスタム カテゴリに含まれるカスタム デスティネーションなどを追加しました。この練習の完成品は、演習フォルダーの Ex1_Solution サブ フォルダーの中にあります。

ページのトップへ


3. 練習 2: サムネイルのカスタマイズ

この練習では、前の練習で作成したものと同等のドキュメント リーダー アプリケーションに対して拡張し、タスク バーのサムネイル プレビュー (DWM プレビュー) をカスタマイズして、ユーザー エクスペリエンスを向上させます。現時点の実装では、サムネイル プレビューは小さなテキストを表示しており、プレビューの上にマウスを移動させ、ピーク プレビュー (エアロ ピーク) を利用して、アプリケーションのウィンドウにドキュメントを表示しないかぎり、ドキュメントのコンテンツの内容を判別できません。ここでは、ユーザーがアプリケーションのウィンドウへ切り替えなくとも、ドキュメントのコンテンツに対して、より良い情報を提供できるように、サムネイル プレビューをカスタマイズします。

ここで、この目的のために使用するサンプル アプリケーションは、リッチ テキスト形式 (RTF) のデータを読み取るドキュメント リーダーであり、一度に 1 つの RTF ドキュメントを表示できます。この練習で使用する手法は、スクリーン上に大量のデータを表示し、既定のサムネイルの表示では不十分なアプリケーションであれば、いずれのアプリケーションにも適用できます。

ページのトップへ

タスク 1 – サムネイル クリッピングを使用する

アプリケーションのサムネイルに、より少ない限られた情報をズームアップして表示するために、Windows 7 タスク バーの API を使用して、アプリケーションのウィンドウからクリッピングして、サムネイルを作ることにします。

  1. 演習用フォルダー内の Ex2_Starter サブ フォルダーにある Ex2_Starter.sln ソリューション ファイルを、Visual Studio 2008 で開きます。
    Note: このソリューションに含まれる Ex2_Starter プロジェクトは、練習 1 の作業が完了した時点の Ex1_Starter プロジェクトと同等のものです。練習 1 と同様に、dependencies サブ フォルダーにある Window API Code Pack 関連のプログラムを使用しているので、演習の冒頭で触れた手順に従って、予め dependencies サブ フォルダーにファイルを用意しておく必要があります。
  2. DocumentReader.cs の中の DocumentReader クラスの中に、bool 型のプライベート メンバー変数 _clipToggled を追加します (以下の完成コードを参照)。
  3. [Toggle Clip] ボタンのイベント ハンドラ (btnToggleClip_Click メソッド) の中に、メンバー変数 _clipToggled が false ならば true に設定し、true ならば false に設定するステートメントを追加します。
  4. メンバー変数 _clipToggled が true ならば、 SetClip メソッドを呼び出すコードを追加します。(まだ、SetClip メソッドを実装していません。) ここまでのコードは次のようになることを確認します。
private bool _clipToggled;
private void btnToggleClip_Click(object sender, EventArgs e)
{
    _clipToggled = !_clipToggled;
    if (_clipToggled)
    {
        SetClip();
    }
}
  1. DocumentReader クラスの中に、次の要領で SetClip メソッドを追加します。(クラスの中であれば、追加する位置は特に問いませんが、見やすくするため、btnToggleClip_Click イベント ハンドラの下あたりでよいでしょう。)
    1. DocumentReader クラス内のプライベート メソッドとして、SetClip メソッドを定義します。引数と戻り値は無しにします。
    2. SetClip メソッドの中では、RichTextBox の GetFirstCharIndexOfCurrentLine メソッドと GetPositionFromCharIndex メソッドを使用して、RichTextBox 内の現在選択されているテキストの位置情報 (Point 型) を求めるコードを追加します。
    3. 位置情報を引数にして、taskbarManager インスタンスの TabbedThumbnail プロパティ オブジェクトが持つ、SetThumbnailClip メソッドを呼び出します。このメソッドでは、四角形領域を指定します。その際、前の手順で求めた Point 型の位置情報を四角形の起点座標にしています。サムネイルのサイズは、演習環境に合わせて適当に指定してください (以下のコードでは、幅が 200、高さが 120)。ここまでのコードは次のようになります。
private void SetClip()
{
    int index = rtbText.GetFirstCharIndexOfCurrentLine();
    Point point = rtbText.GetPositionFromCharIndex(index);
    taskbarManager.TabbedThumbnail.SetThumbnailClip(
        Handle, new Rectangle(point, new Size(200, 120)));
}
  1. ここで実装したサムネイルのクリッピングは、[Toggle Clip] ボタンをクリックし、クリッピングが有効になった際の、1 回きりのクリッピングです。アプリケーションの RichTextBox の中で現在選択されているテキストの位置に応じて、動的なクリッピングを行うには、選択したテキストが変化した際に、クリッピングの範囲を更新するなどの任意の仕組みを実装する必要があります。または、フォームのウィンドウ プロシージャの中から、メッセージ (イベント) を受け取る度に、SetClip メソッドを単に呼び出すということもできます。後者の方法は、奨励される実装ではありませんが、この練習の範疇においては、最も簡単な実装です。以下のように 「base.WndProc (ref m)」の呼び出しの前に、SetClip メソッドの呼び出しを追加します。
protected override void WndProc(ref Message m)
{
    if (_clipToggled)
        SetClip();
    base.WndProc(ref m);
}
  1. ここで、アプリケーションを実行して、[Toggle Clip] ボタンをクリックします。RichTextBox 上のテキストの一部を選択します。このアプリケーションのタスク バー ボタンの上にマウス ポインターを移動し、プレビューを確認します。さらに、アプリケーション内の RichTextBox での選択したテキストを変えて、再びプレビューを表示させます。常に RichTextBox の選択した位置が追跡され、その部分の近辺がプレビューに表示されることを確認します。
    プレビューに表示されることを確認します。
  2. 確認が済んだら、アプリケーションを終了します。

ページのトップへ

タスク 2 – カスタム サムネイルを利用する

前のタスクで使用したサムネイルのクリッピング手法は、ウィンドウ内の特定の領域を拡大する場合に便利です。しかし、ウィンドウ内の元の表示自体をカスタマイズしたい場合もあります。このタスクでは、サムネイル プレビューに表示する内容をカスタマイズします。

なお、このサンプルでは、WPF を使用していませんが、この後で使用するメソッドのいくつかは、オーバーロードされており、その引数に WPF 関連のデータ型を使用しています。そのため、コンパイルする時点では、WPF 関連のアセンブリを参照できる必要があります。まずは、これらのアセンブリへの参照を追加することから始めます。

  1. Ex2_Starter プロジェクトに、必要なアセンブリへの参照を次の要領で追加します。
    1. ソリューション エクスプローラー上で、Ex2_Starter プロジェクト内の [参照設定] ノードを右クリックして、[参照の追加] メニューをクリックします。
    2. [参照の追加] ダイアログ ボックスが表示されたら、[.NET] タブをクリックします。
    3. [.NET] タブに表示された一覧から PresentationCore 3.0.0.0 を選択し、[OK] をクリックして追加します。
    4. 別のアセンブリを追加するので、再び、ソリューション エクスプローラー上で、Ex2_Starter プロジェクト内の [参照設定] ノードを右クリックして、[参照の追加] メニューをクリックします。
    5. [参照の追加] ダイアログ ボックスが表示されたら、[.NET] タブをクリックします。
    6. [.NET] タブに表示された一覧から WindowsBase 3.0.0.0 を選択し、[OK] をクリックして追加します。
    Note: 前述のアセンブリ PresentationCore と WindowsBase は、このプログラムの実行時には直接使用しません。しかし、この後にソース プログラムに記述する Windows API Code Pack の RemoveThumbnailPreview メソッドと SetImage メソッドは、それぞれオーバーロードされていて (多重定義されていて)、WPF 関連のデータ型を引数に持つメソッドが存在します。そのため、オーバーロードされた複数のメソッドの中から、コンパイラが適切なメソッドを判断するためにも、前述の手順のように、これらアセンブリを参照できるように設定する必要があります。
  2. [Toggle Preview] ボタンをクリックすると、サムネイルに表示するカスタム プレビューのオン/オフができるようにするため、次の要領でコードを追加します。
    1. DocumentReader.cs の中の DocumentReader クラスの中に、bool 型のプライベート メンバー変数 _previewToggled を追加します (次のコードを参照)。
    2. [Toggle Preview] ボタンのイベント ハンドラ (btnTogglePreview_Click メソッド) の中に、次のように、メンバー変数 _previewToggled が false ならば true に設定し、true ならば false に設定するステートメントを追加します。
    3. もし、メンバー変数 _previewToggled の値が false ならば、カスタム プレビューを解除するコードを記述します。そのためには、taskbarManager インスタンスの TabbedThumbnail オブジェクト プロパティの RemoveThumbnailPreview メソッドを呼び出します。
    4. メンバー変数 _previewToggled の値が false の場合は、これ以上処理を続ける必要がいなので、return ステートメントを記述して、処理を終了します。
private bool _previewToggled = false;
private void btnTogglePreview_Click(object sender, EventArgs args)
{
    _previewToggled = !_previewToggled;
    if (!_previewToggled)
    {
        taskbarManager.TabbedThumbnail.RemoveThumbnailPreview(
            this.rtbText);
        return;
    }
}
Note: この後、サムネイルにカスタム プレビューを追加する際には、Windows API Code Pack のライブラリを使用して、アプリケーション上の子コントロールである RichTextbox (rtbText) の内容を利用したプレビューを構築します。上記の RemoveThumbnailPreview メソッドに引数として、rtbText を渡しているのは、このカスタム プレビューを解除するためのものです。
  1. 引き続き前述のイベント ハンドラの内部に、カスタム プレビューを追加するためのコードを、次の要領で記述します (この後の完成コードを参照)。

    1. サムネイルでのカスタム プレビューのためのオブジェクトである TabbedThumbnail インスタンスを作成し、変数 thumb に設定します。コンストラクターの引数では、このサムネイルに対応するアプリケーションの親ウィンドウ ハンドルと、実際に表示すべき内容である子コントロール (ここではリッチ テキスト ボックスである rtbText) を指定します。
    2. ここでは、サムネイルのタイトルには、アプリケーションと同じタイトルを表示させるため、変数 thumb (TabbedThumbnail のインスタンス) の Text プロパティには、このアプリケーション フォームの Text プロパティを設定します。
    3. ここでは、サムネイル上の閉じるボタンがクリックされた場合に、アプリケーション自体を終了させめため、変数 thumb の TabbedThumbnailClosed イベントには、Close メソッドを呼び出すブロックを指定します。

      Note: 完成コードにある TabbedThumbnailClosed イベントに、Close メソッド呼び出しのブロックを指定する次の記述方法は、C# 3.0 の言語仕様の「ラムダ」を使用しています。
      thumb.TabbedThumbnailClosed += (o, e) => { Close(); };

      C# 2.0 の「匿名メソッド」を使用して、同じものを記述すると、次のようになります。
      thumb.TabbedThumbnailClosed
      += delegate(object o, TabbedThumbnailEventArgs e) { Close(); };

      また、C# 1.x からある従来のデリゲートを使用すると、次のようになります。
      thumb.TabbedThumbnailClosed
      += new EventHandler<TabbedThumbnailEventArgs>(OnMyClose);

      この例では、さらに OnMyClose という名前のイベント ハンドラが必要になります。

    4. プレビューをカスタマイズするため、変数 thumb (TabbedThumbnail インスタンス) の TabbedThumbnailBitmapRequested イベントに対して、独自の描画を行う処理ブロックを追加します (処理ブロック内部の実装は、この手順以降)。
    5. この処理ブロックの中で、Windows API Code Pack のライブラリにある TabbedThumbnailScreenCapture クラスの .GrabWindowBitmap メソッドを呼び出して、リッチ テキスト ボックス rtbText のクライアント領域をキャプチャして、ビットマップ bitmapCapture を作成します。
    6. このビットマップ bitmapCapture から、描画をするためのGraphics オブジェクトのインスタンス (変数 g) を作成し、さらに透明感のある青色でビットマップ全体を塗りつぶし (FillRectangle メソッド呼び出し)、また、「未保存」という文字を表示するようにします(DrawString 呼び出し)。これによって、ビットマップに描画内容が追加されます。なお、ここでは簡単な表示の実験をするため、表示する内容には、特に意味はありません。
    7. この処理ブロック内の最後では、この処理ブロック (イベント ハンドラ)の 2 番目の引数である e (TabbedThumbnailBitmapRequestedEventArgs 型) の SetImage メソッドを呼び出し、このビットマップ bitmapCapture をサムネイルの表示内容として設定します。
    8. btnTogglePreview_Click イベント ハンドラの最後では、サムネイルのカスタム プレビューに当たる TabbedThumbnail インスタンス (変数 thumb) を追加するため、taskbarManager インスタンスの TabbedThumbnail オブジェクト プロパティの AddThumbnailPreview メソッドを呼び出して、これを追加します。最終的には、次のコードになることを確認します。
private bool _previewToggled = false;
private void btnTogglePreview_Click(object sender, EventArgs args)
{
    _previewToggled = !_previewToggled;
    if (!_previewToggled)
    {
        taskbarManager.TabbedThumbnail.RemoveThumbnailPreview(
            this.rtbText);
        return;
    }
    TabbedThumbnail thumb = new TabbedThumbnail(this.Handle, this.rtbText);
    thumb.Title = this.Text;
    thumb.TabbedThumbnailClosed += (o, e) => { Close(); };
    thumb.TabbedThumbnailBitmapRequested
        += (o, e) =>
        {
            Bitmap bitmapCapture 
                = TabbedThumbnailScreenCapture.GrabWindowBitmap(
                    this.rtbText.Handle, rtbText.ClientSize);
            using (Graphics g = Graphics.FromImage(bitmapCapture))
            {
                g.FillRectangle(
                    new SolidBrush(Color.FromArgb(96, 0, 0, 255)),
                    new Rectangle(new Point(0, 0), bitmapCapture.Size));
                g.DrawString(
                    "未保存!", new Font(SystemFonts.DefaultFont.Name, 48),
                    Brushes.Red, 30.0f, 30.0f);
            }
            e.SetImage(bitmapCapture);
        };
    taskbarManager.TabbedThumbnail.AddThumbnailPreview(thumb);
}
  1. ここで、アプリケーションを実行します。 [Toggle Preview] ボタンをクリックして、カスタム プレビューを有効にします。タスク バーにあるアプリケーションのボタン上にマウス ポインターをホバリングして、サムネイルにカスタム プレビューが表示されることを確認します。
    サムネイルにカスタム プレビューが表示されることを確認します
  2. 次に、サムネイル上でマウス ポインターをホバリングします。すると、サムネイルのプレビューの内容が、アプリケーション ウィンドウにも表示されます。手順 3 で記述した SetImage メソッド呼び出しに指定されたビットマップは、サムネイルだけでなく、サムネイルをホバリングして選択した際に、アプリケーション ウィンドウにも表示されます(この後の Note も参照)。
    アプリケーション ウィンドウにも表示されます
  3. 確認が済んだら、アプリケーションを終了します。

    Note: 前述の手順 5 のように、サムネイルをホバリングした際に、アプリケーション ウィンドウにも同じ内容が表示される機能は、Internet Explorer のように、1 つのアプリケーション ウィンドウに、複数のタブが重なり合っている場合に役に立ちます。複数のタブがある場合は、タスク バー上に、タブごとに異なるサムネイルを並べて表示することができます。この場合、特定のサムネイルの上にマウス ポインターを移動した場合、アプリケーション ウィンドウの表示は、そのサムネイルに対応したタブの内容に連動して切り替わります。前述の SetImage メソッドには、この機能も備えているのです。
    SetImage メソッドには、この機能も備えているのです。

    この練習では、プレビューにおけるクリッピングやカスタマイズを通じて、ドキュメント指向のアプリケーションに、より良いユーザー エクスペリエンスを提供するために、サムネイルを操作する API を利用しました。この練習の完成品は、演習の Ex2フォルダー _Solution サブ フォルダーの中にあります。

ページのトップへ


4. 練習 3: タスク バーでの進行状況と状態

この練習では、Windows 7 タスク バーが提供する新しい通知機能を使用するために、サンプルのインスタント メッセージ (IM) クライアント アプリケーションを題材にします。タスク バー上のボタンに対して、オーバーレイ アイコンを使用して、アプリケーションの状態を表示できるようにして、さらにプログレス バーを使用して、進行状況も表示できるようにします。

ここで、この目的のために使用するサンプル アプリケーションは、サンプルのインスタンス メッセージ クライアントです。しかし、この練習で使用する手法は、実行時に進行状況や状態を表示する必要がある様々なアプリケーションに適用することができます。

Note: Windows 7 では、従来の通知領域 (システム トレイ) を使用しないことが、強く奨励されます。たとえ表示したとしても、Windows 7 のユーザーは、どの通知アイコンを表示するのかを制御することができます。ユーザー エスクペリエンスを統一するためにも、状況を表示するには、タスク バー ボタンに統合したり、サムネイル ツールチップ (この練習の範囲外)やカスタム プレビュー、オーバーレイ アイコンやタスク バーのプログレス バーなどを使用したりします。

ページのトップへ

タスク 1 – オーバーレイ アイコンを表示する

アプリケーションのタスク バー ボタンに、そのアプリケーションの稼働状況を提供するには、各状況に対応したオーバーレイ アイコンを使用します。オーバーレイ アイコンは、この練習用のファイルに含まれますが、任意のアイコンを自由に使用してもかまいません。

  1. 演習用フォルダー内の Ex3_Starter サブ フォルダーにある Ex3_Starter.sln ソリューション ファイルを、Visual Studio 2008 で開きます。
  2. このソリューションに含まれる Ex3_Starter プロジェクトから、Windows API Code Pack を使用するため、以下のパスのアセンブリの参照を追加します。(手順が不明の場合、練習 1、タスク 1 の手順 2 を参考にしてください。)

    \dependencies\Microsoft.WindowsAPICodePack.dll
    \dependencies\Microsoft.WindowsAPICodePack.Shell.dll

  3. 練習で使用する一部のライブラリのため、同様に次のアセンブリへの参照も追加します。(手順が不明の場合、練習 2、タスク 2 の手順 1 を参照してください。ただし、追加するアセンブリは、練習 2 と同一ではありません。)

    PresentationCore 3.0.0.0
    PresentationFramework 3.0.0.0
    WindowsBase 3.0.0.0

    Note: 前述のアセンブリ PresentationCore、PresentationFramework、および WindowsBase は、WPF に関連するものですが、このプログラムの実行時には直接使用しません。しかし、この後にソース プログラムに記述する Windows API Code Pack の SetOverlayIcon メソッドは、オーバーロードされていて (多重定義されていて)、WPF 関連のデータ型を引数に持つメソッドが存在します。そのため、オーバーロードされた複数のメソッドの中から、コンパイラが適切なメソッドを判断するためにも、前述の手順のように、これらアセンブリを参照できるように設定する必要があります。

  4. Windows API Code Pack を使用するので、IMClient.cs ファイルの先頭の他の using ディレクティブの下辺りに、名前空間 Microsoft.WindowsAPICodePack.Taskbar を使用する、次のusing ディレクティブを追加します。
using System.Windows.Forms;
using Microsoft.WindowsAPICodePack.Taskbar;
  1. IMClient クラスの先頭付近に移動し、次のように、このクラスの内側で、TaskbarManger のインスタンスを初期値とするメンバー変数 taskbarManager を宣言します。
...
    public partial class IMClient : Form
    {
        private TaskbarManager taskbarManager = TaskbarManager.Instance;
  1. タスク バーのボタンに、このアプリケーションの状態に応じて、異なるアイコンを表示するため、次の要領でコードを追加します。
    1. IMClient フォーム クラスの中にある、コンボ ボックス cmdStatus のイベント ハンドラ (cmbStatus_SelectedIndexChanged メソッド) の中で、コンボ ボックス内の選択した状態 (cmbStatus.SelectedItem) に基づき、対応する適切なアイコン (Icon 型のオブジェクト) を取得します。そのためには、既存の GetIconByStatus メソッドを呼び出します。(この後の完成コードを参照)
    2. このアイコンをタスク バーのボタンに表示するため、taskbarManager インスタンスの SetOverlayIcon メソッドを呼び出します。
private void cmbStatus_SelectedIndexChanged(object sender, EventArgs e)
{
    Icon icon = GetIconByStatus((string)cmbStatus.SelectedItem);
    taskbarManager.SetOverlayIcon(
       Handle, icon, (string)cmbStatus.SelectedItem);
}
  1. アプリケーションを起動します。ドロップ ダウンリストから、異なる項目を選択して、状況を変更してみます。変更に連動して、タスク バーのボタンの上に、緑色、黄色、または、赤色の丸印に変化することを確認します。
    タスクバーのボタンの上に、緑色、黄色、または、赤色の丸印に変化することを確認します。
  2. 確認が済んだら、アプリケーションを終了します。
    Note: 前述の cmbStatus_SelectedIndexChanged イベント ハンドラは、コンボ ボックスの選択した内容が変化した際に呼び出され、今回はこのタイミングで、オーバーレイ アイコンを変更しています。また、アプリケーションが最初に起動した時点でも、オーバーレイ アイコンを表示する必要があるので、フォームの Shown イベント ハンドラ (IMClient_Shown メソッド) の中では、明示的にコンボ ボックスの選択項目 (SelectedIndex) を設定し、SelectedIndexChanged イベントを強制的に発生させています。
    このコンボ ボックスの選択項目に対する設定が Load イベント ハンドラでない点に注意してください。Load イベントの際に SelectedIndexChanged イベントを発生せて、オーバーレイアイコンを設定しようとしても、この時点ではタスク バーにボタンがないので、オーバーレイ アイコンを設定できません。タスク バーにボタンが生成された後に、オーバーレイ アイコンを設定する必要があるので、ここでは、フォームの初回表示に発生する Shown イベントの時点で行いました。

ページのトップへ

タスク 2 – タスク バーのプログレス バーを使用する

このインスタンス メッセージ アプリケーションでは、擬似的なファイル転送の機能を提供します。この機能は、メンバ一覧の特定のメンバー一人を右クリックして表示されるショートカット メニューから、 [Send File] メニューをクリックして起動できます。ファイル転送は、長い時間を要する可能性がある操作なので、進行状況を表示すべきです。Windows 7 の仕組みにおいて、これを行う最も適切なものは、タスク バーのボタンに表示できるプログレス バーです。たとえウィンドウが隠れていたり、最小化されていたりしても、この表示はユーザーに見ることができます。

  1. このアプリケーションでは、擬似的なファイル転送の最後の段階で、ファイル転送に失敗した旨のメッセージ ボックスを表示します。このタイミングで、タスク バーのボタンに表示されたプログレス バーを、赤色に変化させることにします。そのためには、[Send File] メニューのイベント ハンドラ (sendFileToolstripMenuItem_Click メソッド) の中で、ファイル操作に失敗したメッセージ ボックスの表示の後で、taskbarManager インスタンスの SetProgressState メソッドを呼び出し、引数には TaskbarProgressBarState.Error を渡します。(次の完成コードを参照)
  2. また、ファイル転送中には、刻々とプログレス バーの表示を変化させるため、同じイベント ハンドラの中の else ブロックの中では、現在の値である変数 _percentFileCompleted の値をプログレス バーの値として設定すべく、これを引数にして、taskbarManager インスタンスの SetProgressValue メソッドを呼び出します。ここでは、プログレス バーがフルになった最大値を 100 にするため、2 番目の引数は 100 にします。ここまでのコードは、次のようになります。
private void sendFileToolStripMenuItem_Click(object sender, EventArgs e)
{
    sendFileTimer.Interval = 1000;
    sendFileTimer.Tick += delegate
    {
        _percentFileCompleted += 10;
        if (_percentFileCompleted == 100)
        {
            sendFileTimer.Stop();
            MessageBox.Show("File operation failed!");
            taskbarManager.SetProgressState(
                TaskbarProgressBarState.Error);
            _percentFileCompleted = 0;
        }
        else
        {
            taskbarManager.SetProgressValue(
                _percentFileCompleted, 100);
        }
    };
    sendFileTimer.Start();
}
  1. アプリケーションを起動して、メンバーの一覧から適当なメンバーを右クリックし、[Send File] をクリックします。タスク バー ボタンに進行状況が表示されます。これは、操作が失敗するまで続きます。
    タスクバー ボタンに進行状況が表示されます。
  2. メッセージ ボックスにエラー メッセージを表示したら、そのメッセージ ボックスを閉じると、プログレス バーが赤色になることを確認します。
    プログレスバーが赤色になることを確認します。
  3. 確認が済んだら、アプリケーションを終了します。

この練習では、タスク バー ボタンを介して、エンド ユーザーにより多くの情報を提供するため、タスク バーのオーバーレイ アイコンとプログレス バーを使用しました。この練習の完成品は、演習用フォルダーの Ex3_Solution サブ フォルダーの中にあります。

ページのトップへ


5. まとめ

この演習では、新しい Windows 7 の仕組みを使用して、アプリケーションに差別化する機能を提供する方法を学びました。Windows 7 タスク バーを用いて、デスティネーションやタスクの一覧に、状況依存の情報を提供する方法や、アプリケーションの役立つサムネイル プレビューを提供する方法、また、アプリケーションのタスク バー アイコンに進行状況や状態を表示する方法を確認しました。これによって、ユーザーは、他のアプリケーションに自分たちの仕事を妨げられずに済みます。

その他のいくつかの Windows 7 タスク バーの機能は、この練習では扱っていません。ネイティブ コードに関する情報やサンプルは、Windows SDK for Windows 7 に含まれており、また、Windows API Code Pack では、マネージ コードを使用した様々なサンプルが同梱されています。

ページのトップへ