免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 1998|回复: 2
收起左侧

[技巧] C#自定义文件图标

[复制链接]

478

主题

2万

铜板

146

好友

版主

地信是我家,发展靠大家!

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
12010
发表于 2011-1-25 00:31 | 显示全部楼层 |阅读模式

在我们自己编写的应用中,经常会用自定义类型的文件的来保存与应用相关的数据,如何改变我们的自定义类型的文件的图标?如何双击自定义类型文件的时候启动相应的应用程序了?本文将告诉你如何通过程序来完成这些功能!
        比如.xcf文件就是XCodeFactory应用程序的项目文件。如果没有向Windows注册表注册该文件类型,那么.xcf文件的图标将是windows的文件默认图标,并且你双击一个a.xcf文件,也不会自动启动XCodeFactory应用程序来加载a.xcf文件。如何使.xcf文件的图标变成我自己喜爱的图标、如何完成像点击.doc文件就自动打开word程序的功能,下面将告诉你解决方案。
         我们可以通过手动修改注册表来完成上述任务,更好的方式是,通过程序来实现。这样,在安装应用程序时,就可以自动的注册自定义文件类型了。我通过FileTypeRegister静态类来完成这些功能。首先,将注册需要用到的信息封装成FileTypeRegInfo,定义如下: public class FileTypeRegInfo

  1.     {
  2.         /// <summary>
  3.         /// 目标类型文件的扩展名
  4.         /// </summary>
  5.         public string ExtendName ; //".xcf"
  6.         
  7.         /// <summary>
  8.         /// 目标文件类型说明
  9.         /// </summary>
  10.         public string Description ; //"XCodeFactory项目文件"
  11.         /// <summary>
  12.         /// 目标类型文件关联的图标
  13.         /// </summary>
  14.         public string IcoPath ;
  15.         /// <summary>
  16.         /// 打开目标类型文件的应用程序
  17.         /// </summary>
  18.         public string ExePath ;
  19.         public FileTypeRegInfo()
  20.         {
  21.         }
  22.         public FileTypeRegInfo(string extendName)
  23.         {
  24.             this.ExtendName = extendName ;
  25.         }
  26.     }
复制代码


FileTypeRegister类主要是操作注册表中的内容,实现如下:

  1. /// <summary>
  2.     /// FileTypeRegister 用于注册自定义的文件类型。
  3.     /// zhuweisky 2005.08.31
  4.     /// </summary>
  5.     public class FileTypeRegister
  6.     {        
  7.         RegisterFileType#region RegisterFileType
  8.         /// <summary>
  9.         /// RegisterFileType 使文件类型与对应的图标及应用程序关联起来。
  10.         /// </summary>        
  11.         public static void RegisterFileType(FileTypeRegInfo regInfo)
  12.         {
  13.             if(RegistryHelper.FileTypeRegistered(regInfo.ExtendName))
  14.             {
  15.                 return ;
  16.             }
  17.             string relationName = regInfo.ExtendName.Substring(1 ,regInfo.ExtendName.Length-1).ToUpper() + "_FileType" ;
  18.             RegistryKey fileTypeKey = Registry.ClassesRoot.CreateSubKey(regInfo.ExtendName) ;
  19.             fileTypeKey.SetValue("" ,relationName) ;
  20.             fileTypeKey.Close() ;
  21.             
  22.             RegistryKey relationKey = Registry.ClassesRoot.CreateSubKey(relationName) ;
  23.             relationKey.SetValue("" ,regInfo.Description) ;
  24.             RegistryKey iconKey = relationKey.CreateSubKey("DefaultIcon") ;
  25.             iconKey.SetValue("" ,regInfo.IcoPath) ;
  26.             RegistryKey shellKey   = relationKey.CreateSubKey("Shell") ;
  27.             RegistryKey openKey    = shellKey.CreateSubKey("Open") ;
  28.             RegistryKey commandKey = openKey.CreateSubKey("Command") ;
  29.             commandKey.SetValue("" ,regInfo.ExePath + " %1") ;        
  30.             
  31.             relationKey.Close() ;
  32.         }
  33.         /// <summary>
  34.         /// GetFileTypeRegInfo 得到指定文件类型关联信息
  35.         /// </summary>        
  36.         public static FileTypeRegInfo GetFileTypeRegInfo(string extendName)
  37.         {
  38.             if(! RegistryHelper.FileTypeRegistered(extendName))
  39.             {
  40.                 return null ;
  41.             }
  42.             FileTypeRegInfo regInfo = new FileTypeRegInfo(extendName) ;
  43.             string relationName     = extendName.Substring(1 ,extendName.Length-1).ToUpper() + "_FileType" ;
  44.             RegistryKey relationKey = Registry.ClassesRoot.OpenSubKey(relationName) ;
  45.             regInfo.Description     = relationKey.GetValue("").ToString() ;
  46.             RegistryKey iconKey = relationKey.OpenSubKey("DefaultIcon") ;
  47.             regInfo.IcoPath     = iconKey.GetValue("").ToString();
  48.             RegistryKey shellKey   = relationKey.OpenSubKey("Shell") ;
  49.             RegistryKey openKey    = shellKey.OpenSubKey("Open") ;
  50.             RegistryKey commandKey = openKey.OpenSubKey("Command") ;
  51.             string temp            = commandKey.GetValue("").ToString() ;   
  52.             regInfo.ExePath           = temp.Substring(0 ,temp.Length-3) ;
  53.    
  54.             return regInfo ;
  55.         }
  56.         /// <summary>
  57.         /// UpdateFileTypeRegInfo 更新指定文件类型关联信息
  58.         /// </summary>   
  59.         public static bool UpdateFileTypeRegInfo(FileTypeRegInfo regInfo)
  60.         {
  61.             if(! RegistryHelper.FileTypeRegistered(regInfo.ExtendName))
  62.             {
  63.                 return false ;
  64.             }
  65.       
  66.             string extendName       = regInfo.ExtendName ;
  67.             string relationName     = extendName.Substring(1 ,extendName.Length-1).ToUpper() + "_FileType" ;
  68.             RegistryKey relationKey = Registry.ClassesRoot.OpenSubKey(relationName ,true) ;
  69.             relationKey.SetValue("" ,regInfo.Description) ;
  70.             RegistryKey iconKey = relationKey.OpenSubKey("DefaultIcon" ,true) ;
  71.             iconKey.SetValue("" ,regInfo.IcoPath);
  72.             RegistryKey shellKey   = relationKey.OpenSubKey("Shell") ;
  73.             RegistryKey openKey    = shellKey.OpenSubKey("Open") ;
  74.             RegistryKey commandKey = openKey.OpenSubKey("Command" ,true) ;
  75.             commandKey.SetValue("" ,regInfo.ExePath + " %1") ;   
  76.             relationKey.Close() ;
  77.             return true ;
  78.         }
  79.         /// <summary>
  80.         /// FileTypeRegistered 指定文件类型是否已经注册
  81.         /// </summary>        
  82.         public static bool FileTypeRegistered(string extendName)
  83.         {
  84.             RegistryKey softwareKey = Registry.ClassesRoot.OpenSubKey(extendName);
  85.             if(softwareKey != null)
  86.             {
  87.                 return true ;
  88.             }
  89.             return false ;
  90.         }
  91.         #endregion
  92.     }
复制代码

        要注意的是commandKey.SetValue("" ,regInfo.ExePath + " %1") ;其中" %1"表示将被双击的文件的路径传给目标应用程序,这样在双击a.xcf文件时,XCodeFactory才知道要打开哪个文件,所以应用程序的Main方法要被改写为带有参数的形式,就像下面的样子:

  1.         [STAThread]
  2.         static void Main(string[] args)
  3.         {            
  4.             if((args!= null) && (args.Length > 0))
  5.             {               
  6.                 string filePath = "" ;
  7.                 for(int i=0 ;i<args.Length ;i++)
  8.                 {
  9.                     filePath += " " + args[i] ;
  10.                 }               
  11.                 MainForm.XcfFilePath = filePath.Trim() ;
  12.             }
  13.             
  14.             Application.Run(new MainForm());
  15.         }         
复制代码

   
       关于自定义文件类型的注册,本文实现的是最基本的功能,如果需要更多的高级功能,也可以类推实现之。
锄禾日当午,签到好辛苦!...
头像被屏蔽

0

主题

1849

铜板

1

好友

禁止发言

积分
1405
发表于 2019-4-19 09:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

7

主题

1万

铜板

3

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
5572

灌水勋章

发表于 2024-1-6 14:16 | 显示全部楼层
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表