Jumplist—Win 7與VS2010華麗共舞的平臺
新的特性,讓我們的操作系統及其以此為平臺的各種應用程序更加易用,更加強大。而作為Windows平臺的開發人員,新操作系統的到來則為我們帶來了更多的機會,我們可以借助新的操作系統的各種新特性,讓我們的應用程序更加易用,更加強大,更有利于提高用戶的生產效率;同時新的操作系統也給我們帶來更多的挑戰,我們每個開發者都在考慮自己開發的應用程序是不是“Ready for Windows 7”?是否跟新的操作系統兼容?是否能夠利用新的操作系統的各種新特性?為Windows 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應用程序,將文檔/應用程序固定在任務欄上等等。對于我們開發的應用程序,還可以添加更多的自定義任務。
![]() |
為了更好地理解并為我們自己的應用程序創建Jumplist,我們來分析一下Jumplist所包含的內容。在下圖中我們可以看到,Jumplist主要包含了兩項:目標(名詞)和任務(動詞)。其中目標包含最新使用和最常使用的文檔。為了便于管理,我們還可以將這些文檔進行進一步的分類,甚至創建自己的自定義分類等。而Jumplist中的任務則是指跟此應用程序相關的各項動作,比如執行某個相關的應用程序,執行應用程序的某些常用操作等等。這樣,我們在執行應用程序的一些最常用的動作的時候,就無需切換到應用程序界面而直接從Jumplist執行就可以了,這就為快速訪問應用程序功能帶來了極大的便利,從而提高用戶的生產效率。
![]() |
既然Jumplist如此威力強大,下面我們就來為我們自己的應用程序添加Jumplist支持。在本文中,我們將創建一個簡易的圖片查看應用程序,然后為其添加一個Jumplist功能,從Jumplist中訪問最新的文檔和打開畫圖程序等等。
首先我們啟動Visual Studio 2010,然后創建一個C#的Windows Form應用程序并且將界面編輯如下:
![]() |
其中,我們使用一個按鈕“注冊擴展名”來注冊擴展名,將這個應用程序跟某種文件后綴相互關聯。而另外一個“打開文件”按鈕可以調用通用的文件打開對話框載入圖片。最后,我們使用一個PictureBox控件來顯示圖片。
為了實現Windows 7上的任務欄編程,我們必須首先添加項目對Windows7.DesktopIntegration.dll,
Windows7.DesktopIntegration.RegistrationHelper.exe和VistaBridgeLibrary.dll的引用。這些DLL,那你可以從微軟的網站上獲得。利用這幾個程序集所提供的輔助功能,我們就能很方便地實現任務欄的編程開發。
![]() |
展開全部 文本Tag: Visual Studio 應用程序 微軟 c# .NET Framework 軟件開發 windows 7
注冊應用程序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);
- // …
- }
#p#
使用通用的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
- {
- PathPath = 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添加了自定義的用戶任務,同時添加了一個自定義的文檔分類并添加了相應的內容。現在編譯執行解決方案,就可以看到效果了。
![]() |
通過對Jumplist的編程開發,我們實現了在文檔之間的跳轉和功能任務之間的跳轉,從此再也不用為打開某個常用文檔或者常用功能而在程序菜單中迷茫了。
Let’s Jump!
【編輯推薦】