在我们自己编写的应用中,经常会用自定义类型的文件的来保存与应用相关的数据,如何改变我们的自定义类型的文件的图标?如何双击自定义类型文件的时候启动相应的应用程序了?本文将告诉你如何通过程序来完成这些功能!
比如.xcf文件就是XCodeFactory应用程序的项目文件。如果没有向Windows注册表注册该文件类型,那么.xcf文件的图标将是windows的文件默认图标,并且你双击一个a.xcf文件,也不会自动启动XCodeFactory应用程序来加载a.xcf文件。如何使.xcf文件的图标变成我自己喜爱的图标、如何完成像点击.doc文件就自动打开word程序的功能,下面将告诉你解决方案。
我们可以通过手动修改注册表来完成上述任务,更好的方式是,通过程序来实现。这样,在安装应用程序时,就可以自动的注册自定义文件类型了。我通过FileTypeRegister静态类来完成这些功能。首先,将注册需要用到的信息封装成FileTypeRegInfo,定义如下:
publicclassFileTypeRegInfo
{
/**////<summary>
///目标类型文件的扩展名
///</summary>
publicstringExtendName;//".xcf"
/**////<summary>
///目标文件类型说明
///</summary>
publicstringDescription;//"XCodeFactory项目文件"
/**////<summary>
///目标类型文件关联的图标
///</summary>
publicstringIcoPath;
/**////<summary>
///打开目标类型文件的应用程序
///</summary>
publicstringExePath;
publicFileTypeRegInfo()
{
}
publicFileTypeRegInfo(stringextendName)
{
this.ExtendName=extendName;
}
}
FileTypeRegister类主要是操作注册表中的内容,实现如下:
/**////<summary>
///FileTypeRegister用于注册自定义的文件类型。
///zhuweisky2005.08.31
///</summary>publicclassFileTypeRegister
{
RegisterFileType#regionRegisterFileType
/**////<summary>
///RegisterFileType使文件类型与对应的图标及应用程序关联起来。
///</summary>
publicstaticvoidRegisterFileType(FileTypeRegInforegInfo)
{
if(RegistryHelper.FileTypeRegistered(regInfo.ExtendName))
{
return;
}
stringrelationName=regInfo.ExtendName.Substring(1,regInfo.ExtendName.Length-1).ToUpper()+"_FileType";
RegistryKeyfileTypeKey=Registry.ClassesRoot.CreateSubKey(regInfo.ExtendName);
fileTypeKey.SetValue("",relationName);
fileTypeKey.Close();
RegistryKeyrelationKey=Registry.ClassesRoot.CreateSubKey(relationName);
relationKey.SetValue("",regInfo.Description);
RegistryKeyiconKey=relationKey.CreateSubKey("DefaultIcon");
iconKey.SetValue("",regInfo.IcoPath);
RegistryKeyshellKey=relationKey.CreateSubKey("Shell");
RegistryKeyopenKey=shellKey.CreateSubKey("Open");
RegistryKeycommandKey=openKey.CreateSubKey("Command");
commandKey.SetValue("",regInfo.ExePath+"%1");
relationKey.Close();
}
/**////<summary>
///GetFileTypeRegInfo得到指定文件类型关联信息
///</summary>
publicstaticFileTypeRegInfoGetFileTypeRegInfo(stringextendName)
{
if(!RegistryHelper.FileTypeRegistered(extendName))
{
returnnull;
}
FileTypeRegInforegInfo=newFileTypeRegInfo(extendName);
stringrelationName=extendName.Substring(1,extendName.Length-1).ToUpper()+"_FileType";
RegistryKeyrelationKey=Registry.ClassesRoot.OpenSubKey(relationName);
regInfo.Description=relationKey.GetValue("").ToString();
RegistryKeyiconKey=relationKey.OpenSubKey("DefaultIcon");
regInfo.IcoPath=iconKey.GetValue("").ToString();
RegistryKeyshellKey=relationKey.OpenSubKey("Shell");
RegistryKeyopenKey=shellKey.OpenSubKey("Open");
RegistryKeycommandKey=openKey.OpenSubKey("Command");
stringtemp=commandKey.GetValue("").ToString();
regInfo.ExePath=temp.Substring(0,temp.Length-3);
returnregInfo;
}
/**////<summary>
///UpdateFileTypeRegInfo更新指定文件类型关联信息
///</summary>
publicstaticboolUpdateFileTypeRegInfo(FileTypeRegInforegInfo)
{
if(!RegistryHelper.FileTypeRegistered(regInfo.ExtendName))
{
returnfalse;
}
stringextendName=regInfo.ExtendName;
stringrelationName=extendName.Substring(1,extendName.Length-1).ToUpper()+"_FileType";
RegistryKeyrelationKey=Registry.ClassesRoot.OpenSubKey(relationName,true);
relationKey.SetValue("",regInfo.Description);
RegistryKeyiconKey=relationKey.OpenSubKey("DefaultIcon",true);
iconKey.SetValue("",regInfo.IcoPath);
RegistryKeyshellKey=relationKey.OpenSubKey("Shell");
RegistryKeyopenKey=shellKey.OpenSubKey("Open");
RegistryKeycommandKey=openKey.OpenSubKey("Command",true);
commandKey.SetValue("",regInfo.ExePath+"%1");
relationKey.Close();
returntrue;
}
/**////<summary>
///FileTypeRegistered指定文件类型是否已经注册
///</summary>
publicstaticboolFileTypeRegistered(stringextendName)
{
RegistryKeysoftwareKey=Registry.ClassesRoot.OpenSubKey(extendName);
if(softwareKey!=null)
{
returntrue;
}
returnfalse;
}
#endregion
}
要注意的是commandKey.SetValue("" ,regInfo.ExePath + " %1") ;其中" %1"表示将被双击的文件的路径传给目标应用程序,这样在双击a.xcf文件时,XCodeFactory才知道要打开哪个文件,所以应用程序的Main方法要被改写为带有参数的形式,就像下面的样子:
[STAThread]
staticvoidMain(string[]args)
{
if((args!=null)&&(args.Length>0))
{
stringfilePath="";
for(inti=0;i<args.Length;i++)
{
filePath+=""+args[i];
}
MainForm.XcfFilePath=filePath.Trim();
}
Application.Run(newMainForm());
}
关于自定义文件类型的注册,本文实现的是最基本的功能,如果需要更多的高级功能,也可以类推实现之。
分享到:
相关推荐
3、保存的自定义文件(.cfo格式)可以自动关联图标 4、双击.cfo文件可以自动启动自定义程序打开 主要采用方法: 1、把文件关联信息保存到系统注册表,按指定格式存储,文件即可自动和程序和图标关联! 2、采用...
1、本系统实现自定义模块录入数据功能,可在自定义模块中录入各种模块,自动生成数据表,生成导航菜单,生成模块界面,实现增删改查的简单操作。 2、DataBase文件夹存放SQL的BAK文件,可还原到SQL数据库。 3、...
用户批量生成代码文件(解决方案文件,项目文件,各个层的代码文件) 通过sql语句,生成视图字段实体。 可定义函数模板和类模板,使代码生成更加通用化。 说明:这需要事先安装.net framework 3.5 。...
在AutoCAD二次开发过程中,一般都是开发自定义的命令,然后在菜单栏/工具栏/菜单面板中添加对应的菜单,通过点击菜单调用开发的命令。 对于实现以上问题,传统的做法就是在二次开发类库中开发一个命令方法,并且...
C# WinForm 工作中遇到一个需要将界面表格数据按照设定的格式[表头|列表|表尾]导出到Excel文件,因为格式繁多一个个固定代码编写很不现实,网上找了很久都没有相关的功能实例,于是就加班自己动手写了一个通用的导出...
经供参考
通过注册表把自己的程序添加进入右键(如“我的右键菜单”),鼠标右键某个(或多个)文件时选择“我的右键菜单”,然后弹出winform程序,鼠标选中文件的完整路径及文件名自动显示在winfom中,类似WinRAR右键菜单...
自己写的C#常用类库,使用时请先添加引用:UsrCustomFun.dll、DevComponents.DotNetBar2.dll,压缩包内的其他文件请与UsrCustomFun.dll放置同一目录,然后在程序中引用命名空间:using UsrCustomFun;包括: 1.自定义...
C#基于FTP的自动更新实现源码,附带全面注释 自定义加密算法,保证ini文件关键信息安全 以下为配置文件内容预览 [AutoUpdate] ;当前FTP更新资源的版本 version=1 ;更新完执行的主程序名称,不带后缀 exename=...
1、自定义上传文件类型、浏览资源管理器窗口标题; 2、根据登陆的用户session不同,自动上传至该用户名的目录下,如果没有该用户,则自动建立该用户目录; 3、支持多选,多项文件上传; 4、极速上传、几个G的文件...
3、保存的自定义文件(.cfo格式)可以自动关联图标 4、双击.cfo文件可以自动启动自定义程序打开 5、双击打开多个文件时,程序单进程运行 主要采用方法: 1、把文件关联信息保存到系统注册表,按指定格式存储,文件...
自己封装的继承自C# Winform中ComboBox的下拉多选控件,操作简单,效果非常好。①,可设置允许单选或多选。②,可绑定List,DataTable,Dictionary,string>类型的数据源。③,在下拉列表中可显示自定义的多列数据。...
实现钉钉机器人自动发送自定义信息到钉钉群,解压后查看”使用说明.doc“文档。
C#开发的连接greenplum数据库,完全动态,根据已有的报表模版和需要执行的sql语句,自动填充相应栏目指标。 1、该版本只有一个配置文件; 2、Launcher.config 问程序配置文件 ( 需要在里面配置 :数据库连接 和...
这是本人制作的按钮,在鼠标划过时,该按钮放大,以突出显示,文件中提供了源代码,谨以抛钻引玉
通过配置信息自动生成菜单 环境 C# + vs2005
IniConfig.cs(C# INI文件读写,自动生成配置文件,实际内容根据项目自定义)
11.5.1 在C# 4.0中使用out类型参数修饰符允许协变性 331 11.5.2 在C# 4.0中使用in类型参数修饰符允许逆变性 332 11.5.3 数组对不安全协变性的支持 335 11.6 泛型的内部机制 335 11.6.1 基于值...
C# 简单方便地生成Excel,不需调用Office 组件,可提供: 1.单元格合并、分组、添加字体样式、设置单元格行高、列宽 2.插入图片、设置背景色、边框颜色 3.统计数据、多表统计 4.设置显示格式(自动适应单元格大小、...
如今搞任何一个项目,数据显示都应在网格中显示,一个封装好的网格自定义控件是每个项目...此程序分别 “Dev自定义网格控件”和 "微软自带自定义网格控件",都已封边完毕,支持分页、自动读取Config配置文件加载列数据