注册定义文件扩展名图标和关联相应的应用程序
首先明确一点,这种注册图标,我们主要是通过操作注册表来实现的
以下是通过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

浙公网安备 33010602011771号