首先明确一点,这种注册图标,我们主要是通过操作注册表来实现的
以下是通过C#代码实现的:
/// <summary> /// 文件类型注册信息 /// </summary> public class FileTypeRegInfo { /// <summary> /// 扩展名 /// 如 .fnx /// </summary> public string ExtendName; //"" /// <summary> /// 说明 /// </summary> public string Description; //"fnx项目文件" /// <summary> /// 关联的图标 /// </summary> public string IconPath; /// <summary> /// 应用程序路径 关联后,双击可以打开 /// </summary> public string ExePath; public string OpenDesc; /// <summary> /// 文件类型注册信息 /// </summary> public FileTypeRegInfo(string extendName) { this.ExtendName = extendName; } public FileTypeRegInfo() { } }
public static void RegisterFileType(FileTypeRegInfo regInfo) { if (FileTypeRegistered(regInfo.ExtendName)) { return; } var registryKey = Registry.ClassesRoot.CreateSubKey(regInfo.ExtendName); registryKey?.SetValue("", regInfo.Description); //设置默认图标 using (var iconKey = registryKey?.CreateSubKey("DefaultIcon")) { iconKey?.SetValue("",regInfo.IconPath); } using (var shellRegistryKey = registryKey?.CreateSubKey("shell")) {
//双击打开 using (var openCommandRegistryKey = shellRegistryKey?.CreateSubKey("open\\command")) { openCommandRegistryKey?.SetValue("", regInfo.ExePath + " %1"); } //添加右键打开 using (var menuRegistryKey = shellRegistryKey?.CreateSubKey(regInfo.OpenDesc)) { menuRegistryKey?.SetValue("Icon", regInfo.IconPath); using (var menuCommanRegistryKey = menuRegistryKey?.CreateSubKey("command")) { menuCommanRegistryKey?.SetValue("", regInfo.ExePath + " %1"); } } } } /// <summary> /// 指定文件类型是否已经注册 /// </summary> public static bool FileTypeRegistered(string extendName) { RegistryKey softwareKey = Registry.ClassesRoot.OpenSubKey(extendName); if (softwareKey != null) { return true; } return false; }
测试代码
string extend = ".OSSB"; if (FileTypeRegister.FileTypeRegistered(extend)) { FileTypeRegister.Delete(extend); } if (!FileTypeRegister.FileTypeRegistered(extend)) { FileTypeRegInfo fileTypeRegInfo = new FileTypeRegInfo(extend); fileTypeRegInfo.Description = "OpenSelfFile文件"; fileTypeRegInfo.ExePath = AppDomain.CurrentDomain.BaseDirectory + "RegistryDemo.exe"; ; fileTypeRegInfo.ExtendName = extend; fileTypeRegInfo.IconPath = AppDomain.CurrentDomain.BaseDirectory + "icon.ico"; fileTypeRegInfo.OpenDesc = "使用测试软件打开"; // 注册 FileTypeRegister fileTypeRegister = new FileTypeRegister(); FileTypeRegister.RegisterFileType(fileTypeRegInfo); }
注册完成后我们看注册表
Win+R,输入regedit,打开注册表
基本结构如下:
以上的方式是通过代码实现的,需要有管理身份运行,如果是在软件每次打开的时候,都弹出UAC认证,用户体验不好
如果在打包的时候通过打包安装向导进行注册,就不用每次前软件的时候弹出UAC验证。
以下是通过Innosetup本地打包来实现打包和安装向导
首先需要建立一个注册辅助exe工程,完成的功能主要是注册表的操作
class Program { static void Main(string[] args) { try { if (args.Length >= 5) { string extend = args[0]; string desc = args[1]; string exePath = args[2]; string iconPath = args[3]; string openDesc = args[4]; FileTypeRegInfo fileTypeRegInfo = new FileTypeRegInfo(extend); fileTypeRegInfo.Description = desc; fileTypeRegInfo.ExePath = exePath; ; fileTypeRegInfo.ExtendName = extend; fileTypeRegInfo.IconPath = iconPath; fileTypeRegInfo.OpenDesc = openDesc; // 注册 FileTypeRegister fileTypeRegister = new FileTypeRegister(); FileTypeRegister.RegisterFileType(fileTypeRegInfo); Console.WriteLine("注册成功"); } } catch (Exception ex) { Console.WriteLine(ex); } Console.ReadKey(); }
innosetp 的iss文件需要在Run节点中增加
#define MyAppExeName "Demo.exe" #define MyRegExeName "RegisterUtil.exe" [Run] Filename: "{app}\RegisterUtil\{#MyRegExeName}"; Parameters: ".OSSB 白板文件 {app}\{#MyAppExeName} {app}\icon.ico 使用白板打开" ;Description: "白板文件注册";
打包后根据安装向导进行安装也可以完成注册图标的效果。
增加注册辅助工具后,会增加压缩包的资源。我们可以直接在innosetup操作注册表,进行注册主要需要用到iss
#define MyAppExeName "demo.exe" #define Extend ".OSSB" #define RightBtnMenu="使用 测试 打开" [Registry] Root: HKCR; Subkey: "{#Extend}"; ValueType: string; ValueData: "白板文件"; Flags: deletekey createvalueifdoesntexist Root: HKCR; Subkey: "{#Extend}\DefaultIcon"; ValueType: string; ValueData: "{app}\icon.ico"; Flags: createvalueifdoesntexist Root: HKCR; Subkey: "{#Extend}\shell\open\command"; ValueType: string; ValueData: "{app}\{#MyAppExeName} 1%"; Flags: createvalueifdoesntexist Root: HKCR; Subkey: "{#Extend}\shell\{#RightBtnMenu}"; ValueType: string; ValueName: "Icon"; ValueData: "{app}\icon.ico"; Flags: createvalueifdoesntexist Root: HKCR; Subkey: "{#Extend}\shell\{#RightBtnMenu}\command"; ValueType: string; ValueData: "{app}\{#MyAppExeName} 1%"; Flags: createvalueifdoesntexist
当然以上的iss需要用管理员身份运行
博客参考