如何創建自定義的文件類型關聯


什么叫文件類型關聯

所謂文件類型關聯,就是在Windows操作系統中,我們為某種文件類型(通過文件擴展名來識別)定義有關的操作關聯應用程序。例如,默認情況下,我們雙擊一個.xls文件,就會自動地打開計算機中安裝的Excel這個軟件;雙擊.doc文件,就會自動打開計算機安裝的Word這個軟件。以此類推。

很顯然,文件類型關聯是很重要的一項基礎功能,很多軟件在安裝的時候,都會自動地注冊與這個軟件有關的文件類型。例如我們上面提到的.xls這種文件類型,通常就是在安裝Excel這個軟件的時候,自動地完成注冊的。

 

由用戶手工定義文件類型關聯

文件類型是可以自動關聯(本文后續會討論),但如果沒有自動地進行關聯,那么Windows在我們嘗試打開該文件的時候,就會彈出一個對話框,讓用戶選擇要使用哪一個應用程序來打開。例如下面這樣

image

備注:這個截圖是在Windows 8中的效果,在Windows 7或者更早點版本中,界面可能略有不同。

用戶可以自己選擇一個應用程序,然后就可以用該應用程序打開該文件(如果確實可以的話);而如果用戶選擇了“Use this app for all .xxxx  files”的話,那么以后此類文件都會直接使用該應用程序打開,而無需再選擇了。

那么,這到底是如何實現的呢?一定是在某個地方記錄好了這個信息,對吧?確實是如此的,Windows會通過注冊表的形式記錄好這種文件類型關聯信息,同時為了讓用戶查看方便,用戶可以在控制面板中,通過如下的界面看到所有的文件類型關聯信息。

image

image

image

這里既可以看到現有的關聯信息,但也可以修改。

 

通過安裝項目新建文件類型關聯

現在回過來,雖然用戶確實可以手工地進行關聯設置,但如果我們在部署應用程序的時候,能夠自動地完成這種關聯,當然是很好的。在Visual Studio 2010或者早期版本中,我們可以通過在安裝程序中添加文件類型注冊,這種功能來實現。

你可以通過如下的鏈接來了解如何操作:

http://msdn.microsoft.com/zh-cn/library/vstudio/s3a0ddk6(v=vs.100).aspx

http://msdn.microsoft.com/zh-cn/library/vstudio/93c8y383(v=vs.100).aspx

image

image

通過代碼實現文件類型關聯

上面這種通過安裝程序的做法,是很方便的,可以全方位地定義文件類型關聯,包括圖標,以及各種操作(新建,打開,編輯等等)。但是很遺憾的是,在Visual Studio 2012中,這個“安裝程序”項目模板已經被移除了。那么,如果我們想實現自定義的文件類型關聯,有沒有比較簡單的做法呢?

其實是有的,我之前就提到了,不管怎么樣,這些關聯信息是需要保存在注冊表中的。那么,如果我們覺得有必要的話,就可以通過代碼的形式來創建這些注冊表項。

在注冊表中,有兩個區域可以保存這些信息。

如果你希望某個文件關聯,只影響當前用戶的話,則可以在下面的注冊表位置進行注冊:HKEY_CURRENT_USER\Software\Classes

如果你希望某個文件關聯,影響到當前計算機上面所有用戶的話,則可以在下面的注冊表位置進行注冊:HKEY_LOCAL_MACHINE\SOFTWARE\Classes

那么,具體應該如何注冊呢?

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\.test] //首先為希望注冊的擴展名,新建一個Key

[HKEY_CURRENT_USER\Software\Classes\.test\shell] //然后再新建一個shell的Key

[HKEY_CURRENT_USER\Software\Classes\.test\shell\open]  //然后再新建一個open的Key(open對應了打開操作)

[HKEY_CURRENT_USER\Software\Classes\.test\shell\open\command] //然后再新建一個command的Key
@="D:\\temp\\TestApplication\\TestApplication\\bin\\Debug\\TestApplication.exe %1"   //為command這個Key默認設置為你的自定義應用程序,其中的%1是一個占位符,表示當前的文件路徑。

看起來是下面這樣的

image
既然我們搞清楚這個后台的數據結構,那么通過如下的代碼可以很容易地完成上述注冊。(事實上,你看到只需要1行代碼)

using Microsoft.Win32;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {


            Registry.SetValue(@"HKEY_CURRENT_USER\Software\Classes\.test\shell\open\command", "", "D:\\temp\\TestApplication\\TestApplication\\bin\\Debug\\TestApplication.exe %1");

        }
    }
}

 

那么,在目標的應用程序中,如何接收該文件信息呢?其實很簡單,%1就是那個文件的完整路徑,我們可以在Main方法的參數列表中得到這個信息,然后根據這個信息實現自定義的程序邏輯即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM