在Windows 7操作系统中,任务栏跳转列表(Jumplist)是一个非常重要的特性。它允许用户快速访问应用程序的常用命令和任务。本文将探讨如何自定义应用程序的跳转列表,并展示如何处理从自定义任务中触发的事件。
简单来说,跳转列表可以被视为Windows 7中任务栏项目的上下文菜单。它们可以包含不同的项目集合(类别),每个类别可以执行不同的任务。每个应用程序默认都有一个跳转列表,即使应用程序没有进行任何操作,也会得到一个包含三个任务的默认跳转列表:应用程序名称(本文示例中的JumplistDemo)、将此程序固定到任务栏和关闭窗口。
要处理Windows窗体中的跳转列表类,需要将以下DLL包含到项目中:Microsoft.WindowsAPICodePack.dll和Microsoft.WindowsAPICodePack.Shell.dll。可以从附带的项目中获取它们,或者从WindowsAPICodePack下载开源库,该库包括可以用于访问Windows 7和Windows Vista特性的源代码。
以下是构建跳转列表的步骤:
JumpList list = JumpList.CreateJumpListForIndividualWindow(
TaskbarManager.Instance.ApplicationId, windowHandle);
JumpListCustomCategory userActionsCategory = new JumpListCustomCategory("Actions");
JumpListLink userActionLink = new JumpListLink(
Assembly.GetEntryAssembly().Location, "Clear History");
userActionLink.Arguments = "-1";
userActionsCategory.AddJumpListItems(userActionLink);
list.AddCustomCategories(userActionsCategory);
上述代码将创建一个新的跳转列表,其中包含一个名为Actions的自定义类别,以及一个名为Clear History的JumpListLink。这个链接将用于从跳转列表向应用程序发送消息。将在后面看到如何做到这一点,所以让先完成跳转列表的实现:
string notepadPath = Path.Combine(Environment.SystemDirectory, "notepad.exe");
JumpListLink jlNotepad = new JumpListLink(notepadPath, "Notepad");
jlNotepad.IconReference = new IconReference(notepadPath, 0);
list.AddUserTasks(jlNotepad);
也将对计算器和画图程序执行相同的步骤。只要没有为这些链接指定自定义类别,它们就会被归入任务类别。因此,在构建完列表后,必须调用Refresh()方法以应用这些设置。
附带的项目是一个非常简单的Windows应用程序,它有一个单窗体,上面有一些按钮,其中一个是清除历史记录按钮,该按钮可以清除列表框并更改最近操作标签为“Clear History”。这很容易从窗体上的清除历史记录按钮完成,但是从清除历史记录的JumplistLink呢?实际上,无法处理JumpList中任何链接的点击事件,但希望在JumplistLink被点击时得到通知;在对这个问题进行了广泛的搜索(如何使跳转列表调用应用程序中编写的一些方法并响应自定义事件)之后,发现最好的方法是通过发送消息在Jumplist和应用程序之间进行通信,因此将注册一个消息,该消息将在点击清除历史记录链接后发送,这个消息将被应用程序通过覆盖WndProc方法捕获。
已经在解决方案中包含了一个帮助类WindowsMessageHelper,从“Windows 7: Jump Lists”文章中得到了这个类。这个类调用一些API来发送和注册消息,因此需要执行三个步骤来在Jumplist和应用程序之间发送消息。
首先,通过WindowsMessageHelper类的静态方法RegisterWindowMessage注册消息:
public static int ClearHistoryArg = WindowsMessageHelper.RegisterWindowMessage("Jumplist.demo.ClearHistoryArg");
其次,覆盖WndProc方法并应用更改:
protected override void WndProc(ref Message m)
{
if (m.Msg == WindowsMessageHelper.ClearHistoryArg)
{
ClearHistory();
UpdateRecentAction(RecentActions.ClearHistory);
}
else
{
base.WndProc(ref m);
}
}
第三,实现将消息发送到应用程序的方法:
public static void HandleCmdLineArgs()
{
if (Environment.GetCommandLineArgs().Length > 1)
{
switch (Environment.GetCommandLineArgs()[1])
{
case "-1":
WindowsMessageHelper.SendMessage("Jumplist.demo", WindowsMessageHelper.ClearHistoryArg);
break;
}
}
}
在上述方法中,检查附加的命令行参数,因为该数组的第一个元素是执行程序的名称,这就是为什么检查Length是否大于1的原因,记住在switch-case子句中设置的值-1代表在创建JumpList时为Clear History JumplistLink设置的参数值,所以如果想添加更多的自定义链接,可以将它们的参数设置为想要捕获的任何值。