Jumplist—Win 7與VS2010華麗共舞的平臺(tái)
新的特性,讓我們的操作系統(tǒng)及其以此為平臺(tái)的各種應(yīng)用程序更加易用,更加強(qiáng)大。而作為Windows平臺(tái)的開(kāi)發(fā)人員,新操作系統(tǒng)的到來(lái)則為我們帶來(lái)了更多的機(jī)會(huì),我們可以借助新的操作系統(tǒng)的各種新特性,讓我們的應(yīng)用程序更加易用,更加強(qiáng)大,更有利于提高用戶的生產(chǎn)效率;同時(shí)新的操作系統(tǒng)也給我們帶來(lái)更多的挑戰(zhàn),我們每個(gè)開(kāi)發(fā)者都在考慮自己開(kāi)發(fā)的應(yīng)用程序是不是“Ready for Windows 7”?是否跟新的操作系統(tǒng)兼容?是否能夠利用新的操作系統(tǒng)的各種新特性?為Windows 7開(kāi)發(fā)應(yīng)用程序,成為我們面前的一個(gè)新的課題。
另外,伴隨著Visual Studio 2010 beta1的發(fā)布,下一代基于Windows的應(yīng)用程序開(kāi)發(fā)平臺(tái)已經(jīng)初具雛形:Windows 7 + Visual Studio 2010。這里,我們就基于這一全新的開(kāi)發(fā)平臺(tái),為即將到來(lái)的Windows 7開(kāi)發(fā)應(yīng)用程序。
在Windows 7 RC中,我們可能最先發(fā)現(xiàn)的就是它的界面更加華麗,易用性進(jìn)一步提高了。其中最引人矚目的就是它所帶來(lái)的革命性的新任務(wù)欄。在這個(gè)全新設(shè)計(jì)的任務(wù)欄中,我們可以運(yùn)行各種應(yīng)用程序;在應(yīng)用程序之間進(jìn)行快速切換或者是在同一個(gè)應(yīng)用程序中的不同頁(yè)面之間切換;管理最新文檔/最常用的文檔;訪問(wèn)通用的應(yīng)用程序任務(wù);向用戶報(bào)告程序的進(jìn)度和狀態(tài)等等。通過(guò)這些豐富的功能,新的任務(wù)欄給Windows 7應(yīng)用程序的執(zhí)行帶來(lái)了極大的便利,對(duì)用戶更加友好。所以,讓我們的應(yīng)用程序支持新的任務(wù)欄,可以說(shuō)是讓我們的應(yīng)用程序“Ready for Windows 7”的第一步。
Windows 7中的任務(wù)欄主要包括這些新特性:可以快速執(zhí)行任務(wù)或者打開(kāi)文檔的Jumplist;實(shí)時(shí)的應(yīng)用程序預(yù)覽以及應(yīng)用程序進(jìn)度和狀態(tài)報(bào)告。在本文中,我們首先讓應(yīng)用程序可以支持Jumplist功能,實(shí)現(xiàn)從Vista到Windows 7的Jump!
Jumplist概述
Jumplist實(shí)際上是任務(wù)欄圖標(biāo)的右鍵菜單。任務(wù)欄圖標(biāo)的右鍵菜單很早就有了,但是都只是提供一些簡(jiǎn)單的窗口管理功能,比如窗口的關(guān)閉,最小化,恢復(fù)等等。在Windows 7中,微軟引入了任務(wù)欄圖標(biāo)Jumplist的概念,從Jumplist的表現(xiàn)形式來(lái)看,它實(shí)際上就像一個(gè)Mini版的開(kāi)始菜單,只是通常意義上的開(kāi)始菜單是針對(duì)整個(gè)操作系統(tǒng),而Jumplist則是針對(duì)單個(gè)應(yīng)用程序。通過(guò)Jumplist,我們可以快速地訪問(wèn)應(yīng)用程序的各種最常用功能。比如通過(guò)Word 2007的Jumplist,我們可以直接打開(kāi)最近打開(kāi)過(guò)的文檔,運(yùn)行Word應(yīng)用程序,將文檔/應(yīng)用程序固定在任務(wù)欄上等等。對(duì)于我們開(kāi)發(fā)的應(yīng)用程序,還可以添加更多的自定義任務(wù)。
![]() |
為了更好地理解并為我們自己的應(yīng)用程序創(chuàng)建Jumplist,我們來(lái)分析一下Jumplist所包含的內(nèi)容。在下圖中我們可以看到,Jumplist主要包含了兩項(xiàng):目標(biāo)(名詞)和任務(wù)(動(dòng)詞)。其中目標(biāo)包含最新使用和最常使用的文檔。為了便于管理,我們還可以將這些文檔進(jìn)行進(jìn)一步的分類,甚至創(chuàng)建自己的自定義分類等。而Jumplist中的任務(wù)則是指跟此應(yīng)用程序相關(guān)的各項(xiàng)動(dòng)作,比如執(zhí)行某個(gè)相關(guān)的應(yīng)用程序,執(zhí)行應(yīng)用程序的某些常用操作等等。這樣,我們?cè)趫?zhí)行應(yīng)用程序的一些最常用的動(dòng)作的時(shí)候,就無(wú)需切換到應(yīng)用程序界面而直接從Jumplist執(zhí)行就可以了,這就為快速訪問(wèn)應(yīng)用程序功能帶來(lái)了極大的便利,從而提高用戶的生產(chǎn)效率。
![]() |
既然Jumplist如此威力強(qiáng)大,下面我們就來(lái)為我們自己的應(yīng)用程序添加Jumplist支持。在本文中,我們將創(chuàng)建一個(gè)簡(jiǎn)易的圖片查看應(yīng)用程序,然后為其添加一個(gè)Jumplist功能,從Jumplist中訪問(wèn)最新的文檔和打開(kāi)畫圖程序等等。
首先我們啟動(dòng)Visual Studio 2010,然后創(chuàng)建一個(gè)C#的Windows Form應(yīng)用程序并且將界面編輯如下:
![]() |
其中,我們使用一個(gè)按鈕“注冊(cè)擴(kuò)展名”來(lái)注冊(cè)擴(kuò)展名,將這個(gè)應(yīng)用程序跟某種文件后綴相互關(guān)聯(lián)。而另外一個(gè)“打開(kāi)文件”按鈕可以調(diào)用通用的文件打開(kāi)對(duì)話框載入圖片。最后,我們使用一個(gè)PictureBox控件來(lái)顯示圖片。
為了實(shí)現(xiàn)Windows 7上的任務(wù)欄編程,我們必須首先添加項(xiàng)目對(duì)Windows7.DesktopIntegration.dll,
Windows7.DesktopIntegration.RegistrationHelper.exe和VistaBridgeLibrary.dll的引用。這些DLL,那你可以從微軟的網(wǎng)站上獲得。利用這幾個(gè)程序集所提供的輔助功能,我們就能很方便地實(shí)現(xiàn)任務(wù)欄的編程開(kāi)發(fā)。
![]() |
展開(kāi)全部 文本Tag: Visual Studio 應(yīng)用程序 微軟 c# .NET Framework 軟件開(kāi)發(fā) windows 7
注冊(cè)應(yīng)用程序ID(Application ID)和文件擴(kuò)展名
為了對(duì)任務(wù)欄中停留的各種應(yīng)用程序進(jìn)行分組,在Windows 7中,操作系統(tǒng)新引入了應(yīng)用程序ID(Application ID)的概念。應(yīng)用程序ID(Application ID)是用來(lái)標(biāo)示各個(gè)應(yīng)用程序的,它并不是我們常見(jiàn)的GUID,而是一個(gè)少于128個(gè)字符的字符串。默認(rèn)情況下,應(yīng)用程序的ID是由操作系統(tǒng)根據(jù)進(jìn)程名計(jì)算而得的,當(dāng)然,我們也可以人為地為應(yīng)用程序指定Application ID。在Windows 7中,很多地方都會(huì)用到應(yīng)用程序ID,比如進(jìn)程,窗口,任務(wù)欄按鈕等等。
![]() |
圖5 應(yīng)用程序ID
在Windows 7的任務(wù)欄中,它根據(jù)各個(gè)應(yīng)用程序的ID對(duì)其進(jìn)行分組。同時(shí),為了對(duì)應(yīng)用程序的Jumplist進(jìn)行自定義,我們需要人為的設(shè)置應(yīng)用程序的Application ID。
我們搜先為窗體添加窗體加載函數(shù)Form1_Load(),然后在窗體的加載函數(shù)中,我們?cè)O(shè)置應(yīng)用程序的ID如下:
- private const string APP_ID = "WindowsSeven.Taskbar.JumplistDemo";
- private void Form1_Load(object sender, EventArgs e)
- {
- // 設(shè)置用用程序ID
- Windows7Taskbar.SetCurrentProcessAppId(APP_ID);
- // …
- }
#p#
使用通用的Jumplist功能
完成應(yīng)用程序ID的注冊(cè)后,我們就像擁有了應(yīng)用程序的身份證,可以開(kāi)始對(duì)應(yīng)用程序進(jìn)行操作了。Windows 7操作系統(tǒng)為任務(wù)欄提供了很多通用的功能,比如如果我們使用通用的文件打開(kāi)對(duì)話框打開(kāi)過(guò)某個(gè)文件,那么它就會(huì)自動(dòng)將我們打開(kāi)的文件添加到應(yīng)用程序的Jumplist中。為了利用這些Windows 7提供給我們的通用任務(wù)欄功能,我們需要注冊(cè)文件擴(kuò)展名,將某個(gè)特定的文件擴(kuò)展名跟我們的應(yīng)用程序綁定在一起,這樣,當(dāng)我們?cè)趹?yīng)用程序中打開(kāi)這種類型的文件后,文件就會(huì)出現(xiàn)在應(yīng)用程序的Jumplist中。首先,我們?yōu)椤白?cè)擴(kuò)展名”按鈕添加點(diǎn)擊動(dòng)作響應(yīng)函數(shù)并實(shí)現(xiàn)如下:
- private void RegisterAssociation_Click(object sender, EventArgs e)
- {
- // 注冊(cè)擴(kuò)展名,實(shí)現(xiàn)文件關(guān)聯(lián)
- RegistrationHelper.RegisterFileAssociations(
- APP_ID, false, Windows7Taskbar.GetCurrentProcessAppId(),
- Assembly.GetExecutingAssembly().Location + " /doc:%1",
- ".jpg");
- }
在這段代碼中,我們利用RegistrationHelper將“.jpg”跟我們的應(yīng)用程序綁定在一起了,當(dāng)我們?cè)趹?yīng)用程序中使用通用對(duì)話框打開(kāi)這種類型的文件時(shí),操作系統(tǒng)會(huì)自動(dòng)將這些最近打開(kāi)的文檔添加到應(yīng)用程序的Jumplist中。
接下來(lái),我們利用通用文件對(duì)話框打開(kāi)圖片文件并將其顯示到界面上。將“打開(kāi)文件”按鈕的點(diǎn)擊命令函數(shù)實(shí)現(xiàn)如下:
- private void LoadPic_Click(object sender, EventArgs e)
- {
- // 調(diào)用通用打開(kāi)文件對(duì)話框打開(kāi)圖片文件
- OpenFileDialog ofd = new OpenFileDialog();
- if (ofd.ShowDialog() != DialogResult.OK)
- return;
- // 將圖片顯示到界面上
- pictureBox1.ImageLocation = ofd.FileName;
- }
現(xiàn)在,我們就可以編譯運(yùn)行整個(gè)解決方案。首先我們點(diǎn)擊“注冊(cè)擴(kuò)展名”按鈕,進(jìn)行文件擴(kuò)展名的注冊(cè)。然后,通過(guò)“打開(kāi)文件”按鈕,我們打開(kāi)一個(gè)jpg后綴的圖片文件并將其顯示到界面上。
![]() |
圖6,Jumplist中最近打開(kāi)的文檔
這時(shí)我們就可以在應(yīng)用程序的Jumplist中看到我們最近打開(kāi)的文件了。只需要簡(jiǎn)單的幾行代碼,我們就實(shí)現(xiàn)了Jumplist的功能,為應(yīng)用程序添加Jumplist是不是非常簡(jiǎn)單呢?
有時(shí)候,我們還希望將一些特殊的常用文件添加到Jumplist中,不管這個(gè)文件是否曾經(jīng)打開(kāi)過(guò)。這時(shí),我們借助JumpListManager類可以將特定的文檔添加到Jumplist中。例如:
- private void LoadPic_Click(object sender, EventArgs e)
- {
- // 將特定文檔添加到Jumplist的“最近打開(kāi)”
- JumpListManager jlm = new JumpListManager(APP_ID);
- jlm.UserRemovedItems += delegate { };
- jlm.AddToRecent("DemoPicture.jpg");
- }
在這段代碼中,我們創(chuàng)建了一個(gè)JumpListManager類的實(shí)例并利用應(yīng)用程序ID進(jìn)行初始化。然后我們就可以將自定義的文檔添加到Jumplist的“最新打開(kāi)”目錄下了。
從Jumplist打開(kāi)最新文檔
現(xiàn)在,我們就點(diǎn)擊應(yīng)用程序的Jumplist中的“最近打開(kāi)”的文件,我們可以發(fā)現(xiàn)當(dāng)我們點(diǎn)擊文件后,雖然應(yīng)用程序啟動(dòng)了,但是文件并沒(méi)有被加載進(jìn)來(lái)。所以,我們還需要對(duì)窗體的加載函數(shù)進(jìn)行修改,讓它可以支持從Jumplist打開(kāi)文檔:
- private const string APP_ID = "WindowsSeven.Taskbar.JumplistDemo";
- private void Form1_Load(object sender, EventArgs e)
- {
- // 注冊(cè)應(yīng)用程序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;
- }
- }
- }
經(jīng)過(guò)這樣的修改,當(dāng)我們從Jumplist打開(kāi)文檔時(shí),窗體在加載的時(shí)候,就會(huì)從命令行字符串中提取我們點(diǎn)擊的文件的路徑并打開(kāi)顯示到窗體界面中。
添加自定義任務(wù)
現(xiàn)在,我們已經(jīng)知道如果為應(yīng)用程序的Jumplist添加目標(biāo)了,接下來(lái),我們將介紹如何為Jumplist添加一個(gè)任務(wù),完成各種跟應(yīng)用程序相關(guān)的動(dòng)作。
既然我們開(kāi)發(fā)的是一個(gè)簡(jiǎn)易的圖片瀏覽程序,很多時(shí)候,我們可能希望可以打開(kāi)Windows的畫圖程序?qū)D片進(jìn)行編輯。為了用戶可以快速打開(kāi)畫圖程序,我們將它添加到自定義任務(wù)中。同時(shí),我們也可以在自定義任務(wù)中添加其他的文檔。比如,我們有幾張需要經(jīng)常參考的色標(biāo)圖,這時(shí)我們就可以在Jumplist中新創(chuàng)建一個(gè)“色標(biāo)”分類,然后將這些色標(biāo)圖添加到這個(gè)分類中。
為了完成上面的兩個(gè)功能,我們需要“Windows 7 Bridge Sample”所提供的JumpListManager類。首先我們?cè)诖绑w類中聲明一個(gè)JumpListManager類的對(duì)象,然后我們重載窗體的WndProc函數(shù)并將其實(shí)現(xiàn)如下:
- JumpListManager _jumpListManager;
- protected override void WndProc(ref Message m)
- {
- if (m.Msg == Windows7Taskbar.TaskbarButtonCreatedMessage)
- {
- // 創(chuàng)建對(duì)象并利用應(yīng)用程序ID對(duì)其進(jìn)行初始化
- _jumpListManager = new JumpListManager(APP_ID);
- _jumpListManager.UserRemovedItems += delegate { };
- // 構(gòu)造一個(gè)ShellLink,添加為任務(wù)
- _jumpListManager.AddUserTask(new ShellLink
- {
- PathPath = Path.Combine(Environment.GetFolderPath(
- Environment.SpecialFolder.System),
- @"mspaint.exe"),
- Title = "啟動(dòng)Windows畫圖工具"
- });
- // 添加自定義目標(biāo)文件
- _jumpListManager.AddCustomDestination(new ShellItem
- {
- Path = Directory.GetParent(
- Assembly.GetExecutingAssembly().Location) +
- @"\ColorTab.jpg",
- Category = "色標(biāo)文件"
- });
- _jumpListManager.Refresh();
- }
在上面的代碼中,我們利用JumpListManager類為Jumplist添加了自定義的用戶任務(wù),同時(shí)添加了一個(gè)自定義的文檔分類并添加了相應(yīng)的內(nèi)容。現(xiàn)在編譯執(zhí)行解決方案,就可以看到效果了。
![]() |
通過(guò)對(duì)Jumplist的編程開(kāi)發(fā),我們實(shí)現(xiàn)了在文檔之間的跳轉(zhuǎn)和功能任務(wù)之間的跳轉(zhuǎn),從此再也不用為打開(kāi)某個(gè)常用文檔或者常用功能而在程序菜單中迷茫了。
Let’s Jump!
【編輯推薦】