Windows 7 任务栏跳转列表的自定义与事件处理

在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设置的参数值,所以如果想添加更多的自定义链接,可以将它们的参数设置为想要捕获的任何值。

  • Windows 7: Jump Lists
  • WindowsAPICodePack
  • WndProc
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485