zoukankan      html  css  js  c++  java
  • 注册定义文件扩展名图标和关联相应的应用程序

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

    以下是通过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}shellopencommand"; 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

  • 相关阅读:
    Vue_使用v-model指令写的简易计算器
    Vue_v-for的四种用法示例
    bs4_加载顺序
    Vue_自定义指令
    Vue_v-for中key的使用注意事项
    Vue_指令
    bs4_card(卡片)
    Vue_过滤器
    Vue_生命周期函数
    selenium 文件上传
  • 原文地址:https://www.cnblogs.com/hglSV/p/14974971.html
Copyright © 2011-2022 走看看