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

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

  • 将自定义文件后缀添加默认图标双击
  • 自定义的文件后缀可以自动关联到指定的应用程序并自动打开

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

代码中我们写入了两个注册表。
第一个结构如下图所示,其中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"); 

                        /*
                        string icoFind = Path.Combine("Resources", "C2", "Icon");
                        string icoFile = Path.Combine(System.Windows.Forms.Application.StartupPath, icoFind, "Icon.ico");
                        iconKey.SetValue(String.Empty, icoFile);
                         */

                        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#应用程序自动导入内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • c#根据文件类型获取相关类型图标的方法代码

    复制代码 代码如下: using System;using System.Collections.Generic;using System.Text; namespace WindowsFormsApplication1{    using System;    using System.Drawing;    using System.Runtime.InteropServices;    using Microsoft.Win32;    using System.Reflection;  

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

    这几天开发遇到一个需求: 将自定义文件后缀添加默认图标双击 自定义的文件后缀可以自动关联到指定的应用程序并自动打开 上述第一.二两点其实是一个需求,本质是和注册表有关的操作,在注册表中写入默认图标.默认文件后缀.指定打开文件,一旦明白这个思路代码就非常清晰了. 代码中我们写入了两个注册表. 第一个结构如下图所示,其中DefaultIcon定义的是默认图标地址,Command中存放的是指定识别的软件的运行exe路径. 第二个注册表如下图所示,将默认文件后缀和第一个注册表进行关联,这样就可以进行识别

  • 使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能

    由于微信小程序没有提供类似 Image 这样的 JS 对象,要实现图片的预加载要麻烦一些, wxapp-img-loader自定义组件可以在微信小程序中实现图片预加载功能. 使用 1.下载 wxapp-img-loader项目源代码(https://github.com/o2team/wxa...),将 img-loader 目录拷贝到你的项目中 2.在页面的 WXML 文件中添加以下代码,将组件模板引入 <import src="../../img-loader/img-loader.w

  • Windows 文件类型与打开方式定义方法

    assoc:根据文件扩展名定义文件类型.可以用此命令显示或修改文件扩展名关联 例如: .bat=batfile .xls=Excel.Sheet.8 ftype:根据文件类型定义打开方式.可以用此命令显示或修改用在文件扩展名关联中的文件类型 例如: batfile="%1" %* Excel.Sheet.8="C:\Program Files\Microsoft Office\Office\EXCEL.EXE" /e 说明: Ftype的基本使用格式为:Ftype

  • 微信小程序api列表汇总包括网络API,媒体API,文件API ,微信小程序支付流程,位置API,界面API等

    1)网络 API 列表: wx.request 发起网络请求 wx.uploadFile 上传文件 wx.downloadFile 下载文件 wx.connectSocket 创建 WebSocket 连接 wx.onSocketOpen 监听 WebSocket 打开 wx.onSocketError 监听 WebSocket 错误 wx.sendSocketMessage 发送 WebSocket 消息 wx.onSocketMessage 接受 WebSocket 消息 wx.closeS

  • ASP.NET性能优化之构建自定义文件缓存

    现在,借助于.NET4.0中的OutputCacheProvider,我们可以有多种选择创建自己的缓存.如,我们可以把HTML输出缓存存储到memcached分布式集群服务器,或者MongoDB中(一种常用的面向文档数据库,不妨阅读本篇http://msdn.microsoft.com/zh-cn/magazine/gg650661.aspx).当然,我们也可以把缓存作为文件存储到硬盘上,考虑到可扩展性,这是一种最廉价的做法,本文就是介绍如果构建自定义文件缓存. 1:OutputCachePro

  • C#设置自定义文件图标实现双击启动(修改注册表)

    程序生成的自定义文件,比如后缀是.test 这种文件怎么直接启动打开程序,并打开本文件呢 1.双击打开 2.自定义的文件,有图标显示 3.自定义的文件,点击右键有相应的属性 后台代码:(如何在注册表中修改信息) //工具启动路径 string toolPath = System.Windows.Forms.Application.StartupPath + "\\邮件小工具.exe"; string extension = SptdConst.FileExtension; string

  • php获取文件类型和文件信息的方法

    本文实例讲述了php获取文件类型和文件信息的方法.分享给大家供大家参考.具体实现方法如下: <?php $file = "php.txt"; //打开文件,r表示以只读方式打开 $handle = fopen($file,"r"); //获取文件的统计信息 $fstat = fstat($handle); echo "文件名:".basename($file)."<br>"; //echo "文件大

  • ASP.NET中常见文件类型、扩展名、存放位置及用途总结

    .asax 应用程序根目录. 通常是 Global.asax 文件,该文件包含从 HttpApplication 类派生并表示该应用程序的代码. 有关更多信息,请参见 Global.asax 语法. .ascx 应用程序根目录或子目录. Web 用户控件文件,该文件定义自定义.可重复使用的用户控件. 有关更多信息,请参见 ASP.NET 用户控件. .ashx 应用程序根目录或子目录. 一般处理程序文件,该文件包含实现 IHttpHandler 接口以处理所有传入请求的代码. 有关更多信息,请参

  • PHP 文件类型判断代码

    何为MIME类型,它是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定应用程序来打开. 多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式. 参考链接:php文件格式(mime类型)对照表 . 1.mime_content_type()函数判断获取mime类型 mime_content_type返回指定文件的MIME类型,用法: echo mime_content_type ( 'php.gif' ) . "\n" ; echo

  • php文件类型MIME对照表(比较全)

    由于内容过多,大家可以通过ctrl+F搜索即可 IE浏览器 id 后缀名 php识别出的文件类型 0 gif image/gif 1 jpg image/jpeg 2 png image/png 3 bmp image/bmp 4 psd application/octet-stream 5 ico image/x-icon 6 rar application/octet-stream 7 zip application/zip 8 7z application/octet-stream 9 e

随机推荐