在我們使用windows系統時,我們常看到系統有很多型別,比如word的文件型別,它是以doc副檔名標識的,還有pdf,html,aspx等等,一但我們安裝某些程式,相應型別程式的文件就可以開啟進行編輯了。今天,我們也建立自己的一個型別,並結合JumpList的Recent來開發我們的應用。
如何讓windows系統認識自己的型別,其實就是把我們的型別註冊到登錄檔裡的HKEY_CLASSES_ROOT下,具體註冊資訊,詳看下面程式碼。
程式碼如下:
//註冊應用程式檔案和圖示
RegistryKey classesRoot = Registry.ClassesRoot;
private static void RegisterProgId(string progId, string appId,
string openWith, string IcoPath)
{
RegistryKey progIdKey = classesRoot.CreateSubKey(progId);
progIdKey.SetValue(“FriendlyTypeName”, “@shell32.dll,-8975”);
progIdKey.SetValue(“DefaultIcon”, “@shell32.dll,-47”);
progIdKey.SetValue(“CurVer”, progId);
progIdKey.SetValue(“AppUserModelID”, appId);
RegistryKey shell = progIdKey.CreateSubKey(“shell”);
shell.SetValue(String.Empty, “Open”);
shell = shell.CreateSubKey(“Open”);
shell = shell.CreateSubKey(“Command”);
shell.SetValue(String.Empty, openWith);
RegistryKey iconKey = progIdKey.CreateSubKey(“DefaultIcon”);
iconKey.SetValue(“”, IcoPath);
shell.Close();
progIdKey.Close();
}
//註冊型別
private static void RegisterFileAssociation(string progId, string extension)
{
RegistryKey openWithKey = classesRoot.CreateSubKey(
Path.Combine(extension, “OpenWithProgIds”));
openWithKey.SetValue(progId, String.Empty);
openWithKey.Close();
}
在這個方法中,後兩個引數是比較重要的,openWith引數應用程式所以在路徑和附加引數,IcoPath是應用程對應的圖示。通過這一步,我們就能把自己的型別註冊到系統中,具體的型別依照extension引數來提供。
這樣,如果在系統下建立一個extension實參為型別的檔案時,我們看到的將是以對應圖示替換的檔案,雙擊,呼叫的是我們剛才註冊的應用程式。
比如,我們現在註冊的是diar,在系統下,所有以diar為副檔名的檔案,都成為可執行檔案了。
但怎麼通過雙擊把檔案的內容載入到應用程式中呢?
程式碼如下,在應用程式的載入時執行:
string[] parameters = Environment.GetCommandLineArgs();
if (parameters.Length > 1)
{
filePath = parameters[1];
//filePath傳過來的就是雙擊的檔案的路徑,這樣我們就可以通過IO來操作這個檔案了
}
其實上面這些知識不是Windows7 JumpList所特有的,怎麼和JumpList中的知識關聯呢?
在JumpList中,有一個Recent類別,就是最近開啟的檔案。其實系統有一個RecentList,會儲存最近開啟的文件,這個列表只有在兩種情況下向其中新增子項,第一種就是上面我們在註冊完型別後,雙擊文件時會新增到RecentList中。另一種情部下面說明。
看下面程式碼:
private void OpenDiaryFile()
{
CommonOpenFileDialog dialog = new CommonOpenFileDialog();
dialog.Title = “Select a diary document”;
dialog.Filters.Add(new CommonFileDialogFilter(“Text files (*.diar)”, “*.diar”));
CommonFileDialogResult result = dialog.ShowDialog();
if (result == CommonFileDialogResult.OK)
{
filePath = dialog.FileName;
Content_TB.Text = File.ReadAllText(dialog.FileName, Encoding.Default);
jumplist.AddToRecent(dialog.FileName);
jumplist.KnownCategoryToDisplay = JumpListKnownCategoryType.Recent;//最近 // jumplist.KnownCategoryToDisplay = JumpListKnownCategoryType.Frequent ;//常用
jumplist.Refresh();
}
這段程式碼不難理解,就是用一個定義好的CommonOpenFileDialog對話方塊來開啟一個檔案。這裡的CommonOpenFileDialog是Windows 7 Training Kit For Developers的一個類,必需呼叫這個類,我們才能用jumplist.AddToRecent(dialog.FileName)把最近檔案新增到RecentList中。