如何创建自定义的文件类型关联
什么叫文件类型关联
所谓文件类型关联,就是在Windows操作系统中,我们为某种文件类型(通过文件扩展名来识别)定义有关的操作关联应用程序。例如,默认情况下,我们双击一个.xls文件,就会自动地打开计算机中安装的Excel这个软件;双击.doc文件,就会自动打开计算机安装的Word这个软件。以此类推。
很显然,文件类型关联是很重要的一项基础功能,很多软件在安装的时候,都会自动地注册与这个软件有关的文件类型。例如我们上面提到的.xls这种文件类型,通常就是在安装Excel这个软件的时候,自动地完成注册的。
由用户手工定义文件类型关联
文件类型是可以自动关联(本文后续会讨论),但如果没有自动地进行关联,那么Windows在我们尝试打开该文件的时候,就会弹出一个对话框,让用户选择要使用哪一个应用程序来打开。例如下面这样
备注:这个截图是在Windows 8中的效果,在Windows 7或者更早点版本中,界面可能略有不同。
用户可以自己选择一个应用程序,然后就可以用该应用程序打开该文件(如果确实可以的话);而如果用户选择了“Use this app for all .xxxx files”的话,那么以后此类文件都会直接使用该应用程序打开,而无需再选择了。
那么,这到底是如何实现的呢?一定是在某个地方记录好了这个信息,对吧?确实是如此的,Windows会通过注册表的形式记录好这种文件类型关联信息,同时为了让用户查看方便,用户可以在控制面板中,通过如下的界面看到所有的文件类型关联信息。
这里既可以看到现有的关联信息,但也可以修改。
通过安装项目新建文件类型关联
现在回过来,虽然用户确实可以手工地进行关联设置,但如果我们在部署应用程序的时候,能够自动地完成这种关联,当然是很好的。在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
通过代码实现文件类型关联
上面这种通过安装程序的做法,是很方便的,可以全方位地定义文件类型关联,包括图标,以及各种操作(新建,打开,编辑等等)。但是很遗憾的是,在Visual Studio 2012中,这个“安装程序”项目模板已经被移除了。那么,如果我们想实现自定义的文件类型关联,有没有比较简单的做法呢?
其实是有的,我之前就提到了,不管怎么样,这些关联信息是需要保存在注册表中的。那么,如果我们觉得有必要的话,就可以通过代码的形式来创建这些注册表项。
在注册表中,有两个区域可以保存这些信息。
如果你希望某个文件关联,只影响当前用户的话,则可以在下面的注册表位置进行注册:HKEY_CURRENT_USERSoftwareClasses
如果你希望某个文件关联,影响到当前计算机上面所有用户的话,则可以在下面的注册表位置进行注册:HKEY_LOCAL_MACHINESOFTWAREClasses
那么,具体应该如何注册呢?
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USERSoftwareClasses.test] //首先为希望注册的扩展名,新建一个Key
[HKEY_CURRENT_USERSoftwareClasses.testshell] //然后再新建一个shell的Key
[HKEY_CURRENT_USERSoftwareClasses.testshellopen] //然后再新建一个open的Key(open对应了打开操作)
[HKEY_CURRENT_USERSoftwareClasses.testshellopencommand] //然后再新建一个command的Key
@="D:\temp\TestApplication\TestApplication\bin\Debug\TestApplication.exe %1" //为command这个Key默认设置为你的自定义应用程序,其中的%1是一个占位符,表示当前的文件路径。
看起来是下面这样的
既然我们搞清楚这个后台的数据结构,那么通过如下的代码可以很容易地完成上述注册。(事实上,你看到只需要1行代码)
using Microsoft.Win32; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Registry.SetValue(@"HKEY_CURRENT_USERSoftwareClasses.testshellopencommand", "", "D:\temp\TestApplication\TestApplication\bin\Debug\TestApplication.exe %1"); } } }
那么,在目标的应用程序中,如何接收该文件信息呢?其实很简单,%1就是那个文件的完整路径,我们可以在Main方法的参数列表中得到这个信息,然后根据这个信息实现自定义的程序逻辑即可。