zoukankan      html  css  js  c++  java
  • 如何创建自定义的文件类型关联

    什么叫文件类型关联

    所谓文件类型关联,就是在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_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是一个占位符,表示当前的文件路径。

    看起来是下面这样的

    image
    既然我们搞清楚这个后台的数据结构,那么通过如下的代码可以很容易地完成上述注册。(事实上,你看到只需要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方法的参数列表中得到这个信息,然后根据这个信息实现自定义的程序逻辑即可。

  • 相关阅读:
    ThinkPHP 3.2.2 实现持久登录 ( 记住我 )
    Java实现 LeetCode 20 有效的括号
    Java实现 LeetCode 20 有效的括号
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 17 电话号码的字母组合
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/3256692.html
Copyright © 2011-2022 走看看