技术开发 频道

VS2010与Windows 7共舞:Jumplist

【VS2010与Windows 7共舞系列】
  
    【IT168专稿】
随着Windows 7 RC的发布以及RTM日期的临近,Windows 7离我们是越来越近了。新的操作系统,总是带来很多新的特性。这些新的特性,让我们的操作系统及其以此为平台的各种应用程序更加易用,更加强大。而作为Windows平台的开发人员,新操作系统的到来则为我们带来了更多的机会,我们可以借助新的操作系统的各种新特性,让我们的应用程序更加易用,更加强大,更有利于提高用户的生产效率;同时新的操作系统也给我们带来更多的挑战,我们每个开发者都在考虑自己开发的应用程序是不是“Ready for Windows 7”?是否跟新的操作系统兼容?是否能够利用新的操作系统的各种新特性?为Windows 7开发应用程序,成为我们面前的一个新的课题。

    第二篇:与7共舞 :任务栏缩略图
    第三篇:与7共舞 :任务栏状态提示

    另外,伴随着Visual Studio 2010 beta1的发布,下一代基于Windows的应用程序开发平台已经初具雏形:Windows 7 + Visual Studio 2010。这里,我们就基于这一全新的开发平台,为即将到来的Windows 7开发应用程序。

    在Windows 7 RC中,我们可能最先发现的就是它的界面更加华丽,易用性进一步提高了。其中最引人瞩目的就是它所带来的革命性的新任务栏。在这个全新设计的任务栏中,我们可以运行各种应用程序;在应用程序之间进行快速切换或者是在同一个应用程序中的不同页面之间切换;管理最新文档/最常用的文档;访问通用的应用程序任务;向用户报告程序的进度和状态等等。通过这些丰富的功能,新的任务栏给Windows 7应用程序的执行带来了极大的便利,对用户更加友好。所以,让我们的应用程序支持新的任务栏,可以说是让我们的应用程序“Ready for Windows 7”的第一步。

    Windows 7中的任务栏主要包括这些新特性:可以快速执行任务或者打开文档的Jumplist;实时的应用程序预览以及应用程序进度和状态报告。在本文中,我们首先让应用程序可以支持Jumplist功能,实现从Vista到Windows 7的Jump!

    Jumplist概述

    Jumplist实际上是任务栏图标的右键菜单。任务栏图标的右键菜单很早就有了,但是都只是提供一些简单的窗口管理功能,比如窗口的关闭,最小化,恢复等等。在Windows 7中,微软引入了任务栏图标Jumplist的概念,从Jumplist的表现形式来看,它实际上就像一个Mini版的开始菜单,只是通常意义上的开始菜单是针对整个操作系统,而Jumplist则是针对单个应用程序。通过Jumplist,我们可以快速地访问应用程序的各种最常用功能。比如通过Word 2007的Jumplist,我们可以直接打开最近打开过的文档,运行Word应用程序,将文档/应用程序固定在任务栏上等等。对于我们开发的应用程序,还可以添加更多的自定义任务。

图1  Jumplist是Mini开始菜单

    为了更好地理解并为我们自己的应用程序创建Jumplist,我们来分析一下Jumplist所包含的内容。在下图中我们可以看到,Jumplist主要包含了两项:目标(名词)和任务(动词)。其中目标包含最新使用和最常使用的文档。为了便于管理,我们还可以将这些文档进行进一步的分类,甚至创建自己的自定义分类等。而Jumplist中的任务则是指跟此应用程序相关的各项动作,比如执行某个相关的应用程序,执行应用程序的某些常用操作等等。这样,我们在执行应用程序的一些最常用的动作的时候,就无需切换到应用程序界面而直接从Jumplist执行就可以了,这就为快速访问应用程序功能带来了极大的便利,从而提高用户的生产效率。

图2  Jumplist详解

    既然Jumplist如此威力强大,下面我们就来为我们自己的应用程序添加Jumplist支持。在本文中,我们将创建一个简易的图片查看应用程序,然后为其添加一个Jumplist功能,从Jumplist中访问最新的文档和打开画图程序等等。

   首先我们启动Visual Studio 2010,然后创建一个C#的Windows Form应用程序并且将界面编辑如下:

图3  简易图片查看器

    其中,我们使用一个按钮“注册扩展名”来注册扩展名,将这个应用程序跟某种文件后缀相互关联。而另外一个“打开文件”按钮可以调用通用的文件打开对话框载入图片。最后,我们使用一个PictureBox控件来显示图片。

    为了实现Windows 7上的任务栏编程,我们必须首先添加项目对Windows7.DesktopIntegration.dll, Windows7.DesktopIntegration.RegistrationHelper.exe和VistaBridgeLibrary.dll的引用。这些DLL,那你可以从微软的网站上获得。利用这几个程序集所提供的辅助功能,我们就能很方便地实现任务栏的编程开发。

图4  添加对DLL的引用

    注册应用程序ID(Application ID)和文件扩展名

    为了对任务栏中停留的各种应用程序进行分组,在Windows 7中,操作系统新引入了应用程序ID(Application ID)的概念。应用程序ID(Application ID)是用来标示各个应用程序的,它并不是我们常见的GUID,而是一个少于128个字符的字符串。默认情况下,应用程序的ID是由操作系统根据进程名计算而得的,当然,我们也可以人为地为应用程序指定Application ID。在Windows 7中,很多地方都会用到应用程序ID,比如进程,窗口,任务栏按钮等等。

图5  应用程序ID

    在Windows 7的任务栏中,它根据各个应用程序的ID对其进行分组。同时,为了对应用程序的Jumplist进行自定义,我们需要人为的设置应用程序的Application ID。

    我们搜先为窗体添加窗体加载函数Form1_Load(),然后在窗体的加载函数中,我们设置应用程序的ID如下:

private const string APP_ID = "WindowsSeven.Taskbar.JumplistDemo";
private void Form1_Load(object sender, EventArgs e)
{
// 设置用用程序ID
Windows7Taskbar.SetCurrentProcessAppId(APP_ID);
// …
}
 

    使用通用的Jumplist功能

    完成应用程序ID的注册后,我们就像拥有了应用程序的身份证,可以开始对应用程序进行操作了。Windows 7操作系统为任务栏提供了很多通用的功能,比如如果我们使用通用的文件打开对话框打开过某个文件,那么它就会自动将我们打开的文件添加到应用程序的Jumplist中。为了利用这些Windows 7提供给我们的通用任务栏功能,我们需要注册文件扩展名,将某个特定的文件扩展名跟我们的应用程序绑定在一起,这样,当我们在应用程序中打开这种类型的文件后,文件就会出现在应用程序的Jumplist中。首先,我们为“注册扩展名”按钮添加点击动作响应函数并实现如下:

private void RegisterAssociation_Click(object sender, EventArgs e)
{
// 注册扩展名,实现文件关联
RegistrationHelper.RegisterFileAssociations(
APP_ID, false, Windows7Taskbar.GetCurrentProcessAppId(),
Assembly.GetExecutingAssembly().Location + " /doc:%1",
".jpg");

}

    在这段代码中,我们利用RegistrationHelper将“.jpg”跟我们的应用程序绑定在一起了,当我们在应用程序中使用通用对话框打开这种类型的文件时,操作系统会自动将这些最近打开的文档添加到应用程序的Jumplist中。

    接下来,我们利用通用文件对话框打开图片文件并将其显示到界面上。将“打开文件”按钮的点击命令函数实现如下:

private void LoadPic_Click(object sender, EventArgs e)
{
// 调用通用打开文件对话框打开图片文件
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() != DialogResult.OK)
return;
// 将图片显示到界面上
pictureBox1.ImageLocation = ofd.FileName;
}
 

    现在,我们就可以编译运行整个解决方案。首先我们点击“注册扩展名”按钮,进行文件扩展名的注册。然后,通过“打开文件”按钮,我们打开一个jpg后缀的图片文件并将其显示到界面上。

 图6  Jumplist中最近打开的文档

    这时我们就可以在应用程序的Jumplist中看到我们最近打开的文件了。只需要简单的几行代码,我们就实现了Jumplist的功能,为应用程序添加Jumplist是不是非常简单呢?

    有时候,我们还希望将一些特殊的常用文件添加到Jumplist中,不管这个文件是否曾经打开过。这时,我们借助JumpListManager类可以将特定的文档添加到Jumplist中。例如:

 private void LoadPic_Click(object sender, EventArgs e)
{
// 将特定文档添加到Jumplist的“最近打开”
JumpListManager jlm = new JumpListManager(APP_ID);
jlm.UserRemovedItems += delegate { };
jlm.AddToRecent("DemoPicture.jpg");
}
 

    在这段代码中,我们创建了一个JumpListManager类的实例并利用应用程序ID进行初始化。然后我们就可以将自定义的文档添加到Jumplist的“最新打开”目录下了。 

    从Jumplist打开最新文档

    现在,我们就点击应用程序的Jumplist中的“最近打开”的文件,我们可以发现当我们点击文件后,虽然应用程序启动了,但是文件并没有被加载进来。所以,我们还需要对窗体的加载函数进行修改,让它可以支持从Jumplist打开文档:

 private const string APP_ID = "WindowsSeven.Taskbar.JumplistDemo";
private void Form1_Load(object sender, EventArgs e)
{
// 注册应用程序ID
Windows7Taskbar.SetCurrentProcessAppId(APP_ID);

// 判断命令行是否包含“/doc”
if (Environment.CommandLine.Contains("/doc"))
{
// 从命令行中提取文件路径
string doc = Environment.CommandLine.Substring(
Environment.CommandLine.IndexOf("/doc") +
"/doc".Length + 1);

pictureBox1.ImageLocation = doc;
}
}
}
 

    经过这样的修改,当我们从Jumplist打开文档时,窗体在加载的时候,就会从命令行字符串中提取我们点击的文件的路径并打开显示到窗体界面中。

    添加自定义任务

    现在,我们已经知道如果为应用程序的Jumplist添加目标了,接下来,我们将介绍如何为Jumplist添加一个任务,完成各种跟应用程序相关的动作。

    既然我们开发的是一个简易的图片浏览程序,很多时候,我们可能希望可以打开Windows的画图程序对图片进行编辑。为了用户可以快速打开画图程序,我们将它添加到自定义任务中。同时,我们也可以在自定义任务中添加其他的文档。比如,我们有几张需要经常参考的色标图,这时我们就可以在Jumplist中新创建一个“色标”分类,然后将这些色标图添加到这个分类中。

    为了完成上面的两个功能,我们需要“Windows 7 Bridge Sample”所提供的JumpListManager类。首先我们在窗体类中声明一个JumpListManager类的对象,然后我们重载窗体的WndProc函数并将其实现如下:

JumpListManager _jumpListManager;
protected override void WndProc(ref Message m)
{
if (m.Msg == Windows7Taskbar.TaskbarButtonCreatedMessage)
{
// 创建对象并利用应用程序ID对其进行初始化
_jumpListManager = new JumpListManager(APP_ID);
_jumpListManager.UserRemovedItems += delegate { };

// 构造一个ShellLink,添加为任务
_jumpListManager.AddUserTask(new ShellLink
{
Path = Path.Combine(Environment.GetFolderPath(
Environment.SpecialFolder.System),
@"mspaint.exe"),
Title = "启动Windows画图工具"
});

// 添加自定义目标文件
_jumpListManager.AddCustomDestination(new ShellItem
{
Path = Directory.GetParent(
Assembly.GetExecutingAssembly().Location) +
@"\ColorTab.jpg",
Category = "色标文件"
});
_jumpListManager.Refresh();
}
 


    在上面的代码中,我们利用JumpListManager类为Jumplist添加了自定义的用户任务,同时添加了一个自定义的文档分类并添加了相应的内容。现在编译执行解决方案,就可以看到效果了。
 

图7  自定义任务
 

    通过对Jumplist的编程开发,我们实现了在文档之间的跳转和功能任务之间的跳转,从此再也不用为打开某个常用文档或者常用功能而在程序菜单中迷茫了。

Let’s Jump!

0
相关文章