独自アプリケーションのコマンドの呼び出し
ジャンプリストから外部アプリケーションを起動することは簡単ですが、ジャンプリストを使って独自アプリケーションのコマンドを呼び出したい場合はあまり役に立ちません。現在のところ、ジャンプリストのコマンドはディスク上のファイル、つまりハンドラアプリケーションが登録されたドキュメントファイル、またはオプションのコマンドラインパラメータが指定された実行可能ファイルを参照している必要があります。
つまり技術的に言うと、現在実行中のアプリケーションインスタンスにコマンドを実行させるには、ジャンプリストを表示するアプリケーションインスタンス(「サーバ」)と、ジャンプリストからコマンドが選択されたときにWindowsが起動するアプリケーションインスタンス(「クライアント」)の間に何らかのプロセス間通信(IPC)を実装する必要があるということです。
例えば、アプリケーションに2つのカスタムコマンドを実装する必要があるとします。話を単純にするために、コマンドの名前をCommand AおよびCommand Bとします。これらのコマンドに対応するジャンプリストのタスクを作成するには、実行可能ファイルへのフルパスを作成し、さらにどのコマンドが実際に選択されたかをアプリケーションに通知するコマンドラインパラメータを後ろに追加する必要があります。例えば、パスはC:\MyApps\Win7JumpListDemo.exeのようになります。
このパスを使ってWindowsは実行可能ファイルを起動し、指定されたパラメータを渡します。アプリケーションはコマンドラインパラメータが存在するかどうかをチェックし、正しいパラメータが指定されている場合は、既に実行中のインスタンスにパラメータを通知して直ちに終了します。
最初に、独自アプリケーションのコマンドを呼び出すジャンプリストのタスクを作成する方法を見てみましょう。このコードは以前に示したコードと似ています。
JumpList list = JumpList.CreateJumpList();
...
string selfPath = System.Environment.CommandLine;
// the value comes with quotation marks, strip them out
selfPath = selfPath.Substring(1, selfPath.Length - 3);
JumpListLink selfCommandATask = new JumpListLink(
selfPath, "Command A");
selfCommandATask.Arguments = "Command-A";
selfCommandATask.IconReference = new IconReference(
selfPath, 0);
JumpListLink selfCommandBTask = new JumpListLink(
selfPath, "Command B");
selfCommandBTask.Arguments = "Command-B";
selfCommandBTask.IconReference = new IconReference(
selfPath, 0);
JumpListSeparator separator = new JumpListSeparator();
list.AddUserTasks(notepadTask, calculatorTask,
separator, selfCommandATask, selfCommandBTask);
これらのタスクを追加すると、ジャンプリストは図6のように表示されます。アプリケーションインスタンスへのパスはSystem.Environment.CommandLineプロパティから読み込まれますが、このパスは引用符で囲まれています。ジャンプリストのタスクが正しく処理されるように、引用符を削除する必要があります。そうしないと、アプリケーションが起動するときにエラーが表示されます。

もう1つの重要な部分は、Argumentsプロパティを使ってコマンドラインパラメータを指定することです。本稿の執筆時点では、Windows API Code PackのドキュメントファイルにはArgumentsプロパティに関する記述がまったくありません。それでも、コードからこのプロパティを利用することは可能です。
ユーザーがアプリケーションのジャンプリストから[Command A]を選択すると、Windowsは次のコマンドを(もちろん実際のランタイムパスを使って)実行します。
C:\MyApps\Win7JumpListDemo.exe Command-A
アプリケーションの起動時に、パラメータをチェックする何らかのコードがProgram.csファイルに必要となります。サンプルアプリケーションでは、アプリケーションのmainメソッドが次のようになっています。
static void Main(string[] args)
{
if (CommandLineParameters.ParametersGiven(args))
{
CommandLineParameters.ProcessCommandLine(args);
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ApplicationExit +=
(obj, evt) =>
{
PipeCommunications.SignalCloseEvent();
};
Application.Run(new MainForm());
}
}
CommandLineParametersという名前のカスタムクラスを使って、コマンドラインパラメータがあるかどうかをチェックしています。パラメータがある場合は、同じクラスでパラメータを処理します。パラメータがない場合は、アプリケーションが普通に起動して、ユーザーインターフェースが表示されます。
