Fork me on GitHub

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

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

以下是通过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需要用管理员身份运行

博客参考

https://blog.csdn.net/longji/article/details/53523808

https://www.cnblogs.com/pengsn/p/13344531.html

 

posted @ 2021-07-05 23:58  黄高林  阅读(402)  评论(0编辑  收藏  举报