タスクバーのアイコンに表示されるジャンプリストはアプリの使い勝手を向上させてくれる。本稿では、プログラムからジャンプリストを操作する方法を解説する。
対象:.NET 4.0以降、Windows 7以降
Windows 7以降ではタスクバーのアイコンを右クリックするとジャンプリストが表示される。ここには、最近使ったファイルの一覧や、プログラム独自のタスクを表示できる。本稿では、.NET 4.0以降のWindowsフォームとWPFでジャンプリストのタスクを利用する方法を解説する。
タスクバー上でプログラムのアイコンをマウスで右クリックするか上へドラッグすると(タッチ操作では、長押しするか上へスライドすると)、ジャンプリストが表示される(次の画像)。ジャンプリストに表示される項目には、次のような種類がある。
*1 この2種類の項目をジャンプリストに表示するには、プログラムでJumpListオブジェクトのShowFrequentCategoryプロパティまたはShowRecentCategoryプロパティをTrueに設定する。また、[最近使ったもの]の一覧には、プログラムから追加することも可能である。
System.Windows.Shell名前空間のJumpListクラスとJumpTaskクラスを利用する。処理の流れは次のようになる。この処理は、プログラム中のどこで行ってもよい(複数個所で行うときは注意が必要、後述)。
System.Windows.Shell名前空間を使うには、プロジェクトの参照設定にPresentationFrameworkが必要である。Windowsフォームのプロジェクトでは、手動で追加しておく。
JumpTaskオブジェクトには、Titleプロパティの設定が必須である。[タスク]一覧にタスクを設定する最小限のコードは次のようになる。
// JumpListオブジェクトを生成する
var jumpList = new System.Windows.Shell.JumpList();
// JumpTaskオブジェクトを生成し、JumpListオブジェクトに格納する
var jumpTask = new System.Windows.Shell.JumpTask()
{
Title = "こんにちは",
};
jumpList.JumpItems.Add(jumpTask);
// Applyメソッドを呼び出して、Windowsに通知する
jumpList.Apply();
' JumpListオブジェクトを生成する
Dim jumpList = New System.Windows.Shell.JumpList()
' JumpTaskオブジェクトを生成し、JumpListオブジェクトに格納する
Dim jumpTask = New System.Windows.Shell.JumpTask() With
{
.Title = "こんにちは"
}
jumpList.JumpItems.Add(jumpTask)
' Applyメソッドを呼び出して、Windowsに通知する
jumpList.Apply()
上の最小限のコードでは、[タスク]一覧に表示されたタスクをクリックしてもプログラムが普通に起動するだけである(なお、実際にプログラムを起動する場合には注意が必要だ。これについては本稿の最後で解説する)。タスクに応じた処理を行わせるには、JumpTaskオブジェクトのArgumentsプロパティを指定する。そうすると、タスクから起動されたときに、Argumentsプロパティに指定した文字列がプログラムへの引数として渡される。
また、[タスク]一覧にはあまり長い文字列を表示できない(長すぎる部分は省略される)。そこで、[タスク]一覧に表示されるTitleプロパティの文字列は短めにしておいて、詳しい説明はツールチップにするとよい。それには、JumpTaskオブジェクトのDescriptionプロパティを指定する。
以上の2点を追加したコードは次のようになる。これが一般的な形であろう。
// JumpListオブジェクトを生成する
var jumpList = new System.Windows.Shell.JumpList();
// JumpTaskオブジェクトを生成し、JumpListオブジェクトに格納する
var jumpTask = new System.Windows.Shell.JumpTask()
{
Title = "こんにちは",
Description = "昼の挨拶をします",
Arguments = "/msg=こんにちは",
};
jumpList.JumpItems.Add(jumpTask);
// Applyメソッドを呼び出して、Windowsに通知する
jumpList.Apply();
' JumpListオブジェクトを生成する
Dim jumpList = New System.Windows.Shell.JumpList()
' JumpTaskオブジェクトを生成し、JumpListオブジェクトに格納する
Dim jumpTask = New System.Windows.Shell.JumpTask() With
{
.Title = "こんにちは",
.Description = "昼の挨拶をします",
.Arguments = "/msg=こんにちは"
}
jumpList.JumpItems.Add(jumpTask)
' Applyメソッドを呼び出して、Windowsに通知する
jumpList.Apply()
「タスク」というカテゴリではなく、独自の名前を付けたカテゴリを表示するには、JumpTaskオブジェクトのCustomCategoryプロパティを指定すればよい。
例えば、「CustomCategory01」という名前のカテゴリを作り、そこにタスクを表示するには、次のコードのようにする。
// JumpListオブジェクトを生成する
var jumpList = new System.Windows.Shell.JumpList();
// JumpTaskオブジェクトを生成し、JumpListオブジェクトに格納する
var jumpTask = new System.Windows.Shell.JumpTask()
{
CustomCategory = "CustomCategory01",
Title = "こんにちは",
Description = "昼の挨拶をします",
Arguments = "/msg=こんにちは",
};
jumpList.JumpItems.Add(jumpTask);
// Applyメソッドを呼び出して、Windowsに通知する
jumpList.Apply();
' JumpListオブジェクトを生成する
Dim jumpList = New System.Windows.Shell.JumpList()
' JumpTaskオブジェクトを生成し、JumpListオブジェクトに格納する
Dim jumpTask = New System.Windows.Shell.JumpTask() With
{
.CustomCategory = "CustomCategory01",
.Title = "こんにちは",
.Description = "昼の挨拶をします",
.Arguments = "/msg=こんにちは"
}
jumpList.JumpItems.Add(jumpTask)
' Applyメソッドを呼び出して、Windowsに通知する
jumpList.Apply()
JumpTaskオブジェクトのApplicationPathプロパティを設定することで、指定したプログラムを起動することもできる(次のコード)。
// JumpListオブジェクトを生成する
var jumpList = new System.Windows.Shell.JumpList();
// JumpTaskオブジェクトを生成し、JumpListオブジェクトに格納する
string currentDirectory = System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().Location);
var jumpTask = new System.Windows.Shell.JumpTask()
{
Title = "ReadMeを読む",
Description = "ReadMeを開きます。",
ApplicationPath = @"%SystemRoot%\System32\notepad.exe",
IconResourcePath = @"%SystemRoot%\System32\notepad.exe",
WorkingDirectory = currentDirectory,
Arguments = currentDirectory + @"\ReadMe.txt",
};
jumpList.JumpItems.Add(jumpTask);
// Applyメソッドを呼び出して、Windowsに通知する
jumpList.Apply();
' JumpListオブジェクトを生成する
Dim jumpList = New System.Windows.Shell.JumpList()
' JumpTaskオブジェクトを生成し、JumpListオブジェクトに格納する
Dim currentDirectory As String = System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().Location)
Dim jumpTask = New System.Windows.Shell.JumpTask() With
{
.Title = "ReadMeを読む",
.Description = "ReadMeを開きます。",
.ApplicationPath = "%SystemRoot%\System32\notepad.exe",
.IconResourcePath = "%SystemRoot%\System32\notepad.exe",
.WorkingDirectory = currentDirectory,
.Arguments = currentDirectory & "\ReadMe.txt"
}
jumpList.JumpItems.Add(jumpTask)
' Applyメソッドを呼び出して、Windowsに通知する
jumpList.Apply()
設定する内容が固定的ならば、WPFではXAMLコードでも設定できる(次のコード)。
<Application ……省略…… >
<JumpList.JumpList>
<JumpList>
<JumpTask Title="おはようございます"
Description="朝の挨拶をします"
Arguments="/msg=おはようございます" />
</JumpList>
</JumpList.JumpList>
……省略……
タスクを設定する処理を何カ所かに分けて行う場合(例えばWPFで、固定的なタスクはXAMLコードに、そうでないタスクはコードビハインドに書くといったとき)、2カ所目以降ではJumpListオブジェクトを新しく生成してはいけない。
JumpListオブジェクトを新しく生成すると、それまでに設定したタスクが消えてしまうのだ。Windowsフォームでは、最初に生成したJumpListオブジェクトを保持しておいて、使い回すしかない(その都度、Applyメソッドを呼び出してよい)。
WPFでは、2回目以降はJumpListクラスのGetJumpListメソッドを使って現在のタスク設定を取得できる(次のコード)。
// 既存のJumpListオブジェクトを取得する
var jumpList = System.Windows.Shell.JumpList.GetJumpList(App.Current);
// 以降は同じ
// JumpTaskオブジェクトを生成し、JumpListオブジェクトに格納する
var jumpTask = new System.Windows.Shell.JumpTask()
{
Title = "こんにちは",
Description = "昼の挨拶をします",
Arguments = "/msg=こんにちは",
};
jumpList.JumpItems.Add(jumpTask);
// Applyメソッドを呼び出して、Windowsに通知する
jumpList.Apply();
' 既存のJumpListオブジェクトを取得する
Dim jumpList = System.Windows.Shell.JumpList.GetJumpList(Application.Current)
' 以降は同じ
' JumpTaskオブジェクトを生成し、JumpListオブジェクトに格納する
Dim jumpTask = New System.Windows.Shell.JumpTask() With
{
.Title = "こんにちは",
.Description = "昼の挨拶をします",
.Arguments = "/msg=こんにちは"
}
jumpList.JumpItems.Add(jumpTask)
' Applyメソッドを呼び出して、Windowsに通知する
jumpList.Apply()
タスクを設定したときのArgumentsプロパティが、起動時の引数として渡される。従って、起動時の引数によって動作を変更すればよい。
例えば、「/msg=」で始まる引数を取り出すには、次のコードのようにする。
string msgArgment
= Environment
.GetCommandLineArgs()
.Where(arg => arg.ToUpperInvariant().StartsWith("/MSG="))
.FirstOrDefault();
Dim msgArgment As String _
= Environment _
.GetCommandLineArgs() _
.Where(Function(arg) arg.ToUpperInvariant().StartsWith("/MSG=")) _
.FirstOrDefault()
以上で紹介したコードを組み合わせたサンプルコードを作成した(「Windows desktop code samples:.NET Tips #1115」からダウンロードできる)。
ジャンプリストのテストをするときは、そのままVisual Studioから実行してはいけない。ビルドされた実行ファイルを直接実行するか、Visual Studioホスティングプロセスを無効にした上でVisual Studioから実行する*3。
*3 Visual Studioホスティングプロセスについては、「.NET TIPS:VSホスト・プロセス(*.vshost.exe)とは何か?」を参照していただきたい。
実行結果は次の画像のようになる。ジャンプリストと、ジャンプリストから起動したウィンドウが見えている。
ジャンプリストをWindowsフォーム/WPFから利用するのは意外と簡単である。ぜひ活用していただきたい。
利用可能バージョン:.NET Framework 4.0以降
カテゴリ:Windowsフォーム 処理対象:ウィンドウ
カテゴリ:WPF/XAML 処理対象:タスクバー
使用ライブラリ:JumpListクラス(System.Windows.Shell名前空間)
使用ライブラリ:JumpTaskクラス(System.Windows.Shell名前空間)
関連TIPS:WPF/Windowsフォーム:タスクバーのアイコンに進捗表示を出すには?[C#、VB]
関連TIPS:タスクバー上のボタンやウィンドウのタイトルバーを点滅させるには?[C#、VB]
関連TIPS:タスクバーにアイコンを表示させないようにするには?
Copyright© Digital Advantage Corp. All Rights Reserved.