您的位置:首页 > 编程语言 > C#

使用C#自动注册自定义文件类型

2012-06-06 21:59 477 查看
使用C#自动注册自定义文件类型

转自:http://www.cnblogs.com/gaoxiang/articles/403516.html

需要注意的一点是,图标需要用ico格式的。我之前用的是其他格式的图,一直设置不起,花了些时间。

在我们自己编写的应用中,经常会用自定义类型的文件的来保存与应用相关的数据,如何改变我们的自定义类型的文件的图标?如何双击自定义类型文件的时候启动相应的应用程序了?本文将告诉你如何通过程序来完成这些功能!

比如.xcf文件就是XCodeFactory应用程序的项目文件。如果没有向Windows注册表注册该文件类型,那么.xcf文件的图标将是windows的文件默认图标,并且你双击一个a.xcf文件,也不会自动启动XCodeFactory应用程序来加载a.xcf文件。如何使.xcf文件的图标变成我自己喜爱的图标、如何完成像点击.doc文件就自动打开word程序的功能,下面将告诉你解决方案。

我们可以通过手动修改注册表来完成上述任务,更好的方式是,通过程序来实现。这样,在安装应用程序时,就可以自动的注册自定义文件类型了。我通过FileTypeRegister静态类来完成这些功能。首先,将注册需要用到的信息封装成FileTypeRegInfo,定义如下:


public class FileTypeRegInfo


{


/// <summary>


/// 目标类型文件的扩展名


/// </summary>


public string ExtendName ; //".xcf"





/// <summary>


/// 目标文件类型说明


/// </summary>


public string Description ; //"XCodeFactory项目文件"




/// <summary>


/// 目标类型文件关联的图标


/// </summary>


public string IcoPath ;




/// <summary>


/// 打开目标类型文件的应用程序


/// </summary>


public string ExePath ;




public FileTypeRegInfo()


{


}




public FileTypeRegInfo(string extendName)


{


this.ExtendName = extendName ;


}


}

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


/// <summary>


/// FileTypeRegister 用于注册自定义的文件类型。


/// zhuweisky 2005.08.31


/// </summary>


public class FileTypeRegister


{


#region RegisterFileType


/// <summary>


/// RegisterFileType 使文件类型与对应的图标及应用程序关联起来。


/// </summary>


public static void RegisterFileType(FileTypeRegInfo regInfo)


{


if(RegistryHelper.FileTypeRegistered(regInfo.ExtendName))


{


return ;


}




string relationName = regInfo.ExtendName.Substring(1 ,regInfo.ExtendName.Length-1).ToUpper() + "_FileType" ;




RegistryKey fileTypeKey = Registry.ClassesRoot.CreateSubKey(regInfo.ExtendName) ;


fileTypeKey.SetValue("" ,relationName) ;


fileTypeKey.Close() ;





RegistryKey relationKey = Registry.ClassesRoot.CreateSubKey(relationName) ;


relationKey.SetValue("" ,regInfo.Description) ;




RegistryKey iconKey = relationKey.CreateSubKey("DefaultIcon") ;


iconKey.SetValue("" ,regInfo.IcoPath) ;




RegistryKey shellKey = relationKey.CreateSubKey("Shell") ;


RegistryKey openKey = shellKey.CreateSubKey("Open") ;


RegistryKey commandKey = openKey.CreateSubKey("Command") ;


commandKey.SetValue("" ,regInfo.ExePath + " %1") ;





relationKey.Close() ;


}




/// <summary>


/// GetFileTypeRegInfo 得到指定文件类型关联信息


/// </summary>


public static FileTypeRegInfo GetFileTypeRegInfo(string extendName)


{


if(! RegistryHelper.FileTypeRegistered(extendName))


{


return null ;


}




FileTypeRegInfo regInfo = new FileTypeRegInfo(extendName) ;




string relationName = extendName.Substring(1 ,extendName.Length-1).ToUpper() + "_FileType" ;


RegistryKey relationKey = Registry.ClassesRoot.OpenSubKey(relationName) ;


regInfo.Description = relationKey.GetValue("").ToString() ;




RegistryKey iconKey = relationKey.OpenSubKey("DefaultIcon") ;


regInfo.IcoPath = iconKey.GetValue("").ToString();




RegistryKey shellKey = relationKey.OpenSubKey("Shell") ;


RegistryKey openKey = shellKey.OpenSubKey("Open") ;


RegistryKey commandKey = openKey.OpenSubKey("Command") ;


string temp = commandKey.GetValue("").ToString() ;


regInfo.ExePath = temp.Substring(0 ,temp.Length-3) ;





return regInfo ;


}




/// <summary>


/// UpdateFileTypeRegInfo 更新指定文件类型关联信息


/// </summary>


public static bool UpdateFileTypeRegInfo(FileTypeRegInfo regInfo)


{


if(! RegistryHelper.FileTypeRegistered(regInfo.ExtendName))


{


return false ;


}







string extendName = regInfo.ExtendName ;


string relationName = extendName.Substring(1 ,extendName.Length-1).ToUpper() + "_FileType" ;


RegistryKey relationKey = Registry.ClassesRoot.OpenSubKey(relationName ,true) ;


relationKey.SetValue("" ,regInfo.Description) ;




RegistryKey iconKey = relationKey.OpenSubKey("DefaultIcon" ,true) ;


iconKey.SetValue("" ,regInfo.IcoPath);




RegistryKey shellKey = relationKey.OpenSubKey("Shell") ;


RegistryKey openKey = shellKey.OpenSubKey("Open") ;


RegistryKey commandKey = openKey.OpenSubKey("Command" ,true) ;


commandKey.SetValue("" ,regInfo.ExePath + " %1") ;




relationKey.Close() ;




return true ;


}




/// <summary>


/// FileTypeRegistered 指定文件类型是否已经注册


/// </summary>


public static bool FileTypeRegistered(string extendName)


{


RegistryKey softwareKey = Registry.ClassesRoot.OpenSubKey(extendName);


if(softwareKey != null)


{


return true ;


}




return false ;


}


#endregion


}



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


[STAThread]


static void Main(string[] args)


{


if((args!= null) && (args.Length > 0))


{


string filePath = "" ;


for(int i=0 ;i<args.Length ;i++)


{


filePath += " " + args[i] ;


}




MainForm.XcfFilePath = filePath.Trim() ;


}





Application.Run(new MainForm());


}

关于自定义文件类型的注册,本文实现的是最基本的功能,如果需要更多的高级功能,也可以类推实现之。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: