gpt4 book ai didi

c# - 将文件扩展名与应用程序相关联

转载 作者:IT王子 更新时间:2023-10-29 03:49:24 26 4
gpt4 key购买 nike

我编写了一个编辑特定文件类型的程序,我想让用户选择在启动时将我的应用程序设置为该文件类型的默认编辑器(因为我不需要安装程序)。

我试图通过向 HKEY_CLASSES_ROOT 添加一个键来编写一个可重复使用的方法,为我关联一个文件(最好在任何操作系统上,尽管我运行的是 Vista),并将其用于我的应用程序,但它似乎不起作用。

public static void SetAssociation(string Extension, string KeyName, string OpenWith, string FileDescription)
{
RegistryKey BaseKey;
RegistryKey OpenMethod;
RegistryKey Shell;
RegistryKey CurrentUser;

BaseKey = Registry.ClassesRoot.CreateSubKey(Extension);
BaseKey.SetValue("", KeyName);

OpenMethod = Registry.ClassesRoot.CreateSubKey(KeyName);
OpenMethod.SetValue("", FileDescription);
OpenMethod.CreateSubKey("DefaultIcon").SetValue("", "\"" + OpenWith + "\",0");
Shell = OpenMethod.CreateSubKey("Shell");
Shell.CreateSubKey("edit").CreateSubKey("command").SetValue("", "\"" + OpenWith + "\"" + " \"%1\"");
Shell.CreateSubKey("open").CreateSubKey("command").SetValue("", "\"" + OpenWith + "\"" + " \"%1\"");
BaseKey.Close();
OpenMethod.Close();
Shell.Close();

CurrentUser = Registry.CurrentUser.CreateSubKey(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" + Extension);
CurrentUser = CurrentUser.OpenSubKey("UserChoice", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl);
CurrentUser.SetValue("Progid", KeyName, RegistryValueKind.String);
CurrentUser.Close();
}

知道为什么它不起作用吗?一个例子可能是

SetAssociation(".ucs", "UCS_Editor_File", Application.ExecutablePath, "UCS File"); 

如果我使用 regedit 执行相同的操作,则方法中使用“CurrentUser”的部分似乎有效,但使用我的应用程序时却无效。

最佳答案

答案比我预期的要简单得多。 Windows Explorer 有自己的 open with 应用程序覆盖,我试图在最后几行代码中修改它。如果您只是删除资源管理器覆盖,则文件关联将起作用。

我还告诉资源管理器,我通过使用 P/Invoke 调用非托管函数 SHChangeNotify() 更改了文件关联

public static void SetAssociation(string Extension, string KeyName, string OpenWith, string FileDescription)
{
// The stuff that was above here is basically the same

// Delete the key instead of trying to change it
var CurrentUser = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\" + Extension, true);
CurrentUser.DeleteSubKey("UserChoice", false);
CurrentUser.Close();

// Tell explorer the file association has been changed
SHChangeNotify(0x08000000, 0x0000, IntPtr.Zero, IntPtr.Zero);
}

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

关于c# - 将文件扩展名与应用程序相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2681878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com