C#关联⾃定义⽂件类型到应⽤程序并实现⾃动导⼊功能这⼏天开发遇到⼀个需求:
writeline方法的作用
将⾃定义⽂件后缀添加默认图标双击
⾃定义的⽂件后缀可以⾃动关联到指定的应⽤程序并⾃动打开
上述第⼀、⼆两点其实是⼀个需求,本质是和注册表有关的操作,在注册表中写⼊默认图标、默认⽂件后缀、指定打开⽂件,⼀旦明⽩这个思路代码就⾮常清晰了。
代码中我们写⼊了两个注册表。
第⼀个结构如下图所⽰,其中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#应⽤程序⾃动导⼊内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。