文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C#关联自定义文件类型到应用程序并实现自动导入功能

2024-04-02 19:55

关注

这几天开发遇到一个需求:

上述第一、二两点其实是一个需求,本质是和注册表有关的操作,在注册表中写入默认图标、默认文件后缀、指定打开文件,一旦明白这个思路代码就非常清晰了。

代码中我们写入了两个注册表。
第一个结构如下图所示,其中DefaultIcon定义的是默认图标地址,Command中存放的是指定识别的软件的运行exe路径。

在这里插入图片描述

第二个注册表如下图所示,将默认文件后缀和第一个注册表进行关联,这样就可以进行识别。

在这里插入图片描述

添加进去之后,我们发现双击文件可以打开软件,但是默认图标并没有刷新,经过查询,需要重启,但这样不是太low了吗,难道每个用户安装一次软件都要重启吗,这时候就需要实现自动对注册表进行刷新,直接引用即可,代码如下。


[DllImport("shell32.dll")]
public static extern void SHChangeNotify(uint wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);

SHChangeNotify(0x8000000, 0, IntPtr.Zero, IntPtr.Zero);

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Microsoft.Win32;
namespace AppC
{
    static class Program
    {
        /// <summary> 
        /// 应用程序的主入口点。 
        /// </summary> 
        [STAThread]
        static void Main(string[] args) 
        { 
            Application.EnableVisualStyles(); 
            Application.SetCompatibleTextRenderingDefault(false); 
 
            /// 是否通过关联打开的软件 
            if (args.Length > 0) 
            {
                string path="";
                for(int i=0;i<args.Length;i++)
                    path+=args[i]+" ";
                path=path.TrimEnd(' ');
                Console.WriteLine(path);
                Console.ReadKey();
                //Application.Run(new mainForm(path)); 
            }
            else 
            { 
                string keyName; 
                string keyValue; 
                keyName = "C2File"; 
                keyValue = "C2文件"; 
                RegistryKey isExCommand = null; 
                bool isCreateRegistry = true; 
 
                try 
                { 
                    /// 检查 文件关联是否创建 
                    isExCommand = Registry.ClassesRoot.OpenSubKey(keyName); 
                    if (isExCommand == null) 
                    { 
                        isCreateRegistry = true; 
                    } 
                    else 
                    { 
                        if (isExCommand.GetValue("Create").ToString() == Application.ExecutablePath.ToString()) 
                        { 
                            isCreateRegistry = false; 
                        } 
                        else 
                        { 
                            Registry.ClassesRoot.DeleteSubKeyTree(keyName); 
                            isCreateRegistry = true;                             
                        } 
                    } 
                } 
                catch (Exception) 
                { 
                    isCreateRegistry = true; 
                } 
 
                /// 假如 文件关联 还没有创建,或是关联位置已被改变 
                //if (isCreateRegistry) 
                { 
                    try 
                    { 
                        RegistryKey key, keyico; 
                        key = Registry.ClassesRoot.CreateSubKey(keyName); 
                        key.SetValue("Create", Application.ExecutablePath.ToString()); 
 
                        keyico = key.CreateSubKey("DefaultIcon"); 
                        keyico.SetValue("", Application.ExecutablePath + ",0"); 
                        
                        
 
                        key.SetValue("", keyValue); 
                        key = key.CreateSubKey("Shell"); 
                        key = key.CreateSubKey("Open"); 
                        key = key.CreateSubKey("Command"); 
 
                        /// 关联的位置 
                        key.SetValue("", Application.ExecutablePath.ToString() + @" %1/");
 
                        /// 关联的文件扩展名,  
                        keyName = ".c2"; 
                        keyValue = "C2File"; 
                        key = Registry.ClassesRoot.CreateSubKey(keyName); 
                        key.SetValue("", keyValue); 
                    } 
                    catch (Exception) 
                    { 
                    } 
                } 
                //Application.Run(new mainForm("")); 
            } 
        }
    }
}

但是还有一个问题,就是打包,由于我们对注册表的写入是写在Main函数里的,如果用Visual Studio自带的工具进行打包的话,也就是说每次用户在打开软件都会进行一次注册表读写的判断,虽然用户不感知,但是这样并不好。所以我们并不打算将注册表的写入放在Main函数中,而是使用Inno Script Studio这个工具进行美化,将注册表的写入放在里面,这样用户只会在安装的时候写入注册表,删除软件注册表也会自动清空。


#define MyAppExeName "软件.exe"
#define AppIconName "默认图标路径"

[Registry]
Root:HKCU;Subkey: "{#MyRegInstallPath_sk}" ; ValueType:string; ValueName:"{#MyRegInstallPath_vn}"; ValueData:"{app}";Flags:uninsdeletekeyifempty
Root: HKCR; Subkey: ".c2"; Flags: uninsdeletekey
Root: HKCR; Subkey: ".c2"; ValueType: string; ValueName: ""; ValueData: "C2File"
Root: HKCR; Subkey: "C2File"; Flags: uninsdeletekey
Root: HKCR; Subkey: "C2File\DefaultIcon"; Flags: uninsdeletekey
Root: HKCR; Subkey: "C2File\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#AppIconName}"; Flags: 
Root: HKCR; Subkey: "C2File\shell"; Flags: uninsdeletekey
Root: HKCR; Subkey: "C2File\shell\open"; Flags: uninsdeletekey
Root: HKCR; Subkey: "C2File\shell\open\command"; Flags: uninsdeletekey
Root: HKCR; Subkey: "C2File\shell\open\command"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName} ""%1"""; Flags:

到此这篇关于C#关联自定义文件类型到应用程序并实现自动导入的文章就介绍到这了,更多相关c#应用程序自动导入内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯