张志峰的博客

水滴石川,积少成多。

导航

如何创建自定义的文件类型关联

Posted on 2016-04-08 16:41  ╰★张志峰★╮  阅读(459)  评论(0编辑  收藏  举报

 

什么叫文件类型关联

所谓文件类型关联,就是在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方法的参数列表中得到这个信息,然后根据这个信息实现自定义的程序逻辑即可。