Fork me on GitHub

注册定义文件扩展名图标和关联相应的应用程序

首先明确一点,这种注册图标,我们主要是通过操作注册表来实现的

以下是通过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

 

posted @   黄高林  阅读(420)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示