注册定义文件扩展名图标和关联相应的应用程序
首先明确一点,这种注册图标,我们主要是通过操作注册表来实现的
以下是通过C#代码实现的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /// <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() { } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 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" )) {<br> //双击打开 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 ; } |
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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工程,完成的功能主要是注册表的操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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节点中增加
1 2 3 4 5 | #define MyAppExeName "Demo.exe" #define MyRegExeName "RegisterUtil.exe" [Run] Filename: "{app}\RegisterUtil\{#MyRegExeName}" ; Parameters: ".OSSB 白板文件 {app}\{#MyAppExeName} {app}\icon.ico 使用白板打开" ;Description: "白板文件注册" ; |
打包后根据安装向导进行安装也可以完成注册图标的效果。
增加注册辅助工具后,会增加压缩包的资源。我们可以直接在innosetup操作注册表,进行注册主要需要用到iss
1 2 3 4 5 6 7 8 9 10 | #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需要用管理员身份运行
博客参考
https://blog.csdn.net/longji/article/details/53523808
https://www.cnblogs.com/pengsn/p/13344531.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗