首页 > 后端开发 > C++ > 如何在 C# 中可靠地将文件扩展名与应用程序关联起来?

如何在 C# 中可靠地将文件扩展名与应用程序关联起来?

Linda Hamilton
发布: 2025-01-19 23:31:13
原创
395 人浏览过

How to Reliably Associate File Extensions with Applications in C#?

将文件扩展名与应用程序关联

问题:

作为软件开发人员,您希望允许用户将您的应用程序设置为特定文件类型的默认编辑器。但是,您当前的方法似乎无法正常运行。

响应:

在以下情况下,提供的方法可能会遇到问题:

  • 您的应用程序未以提升的权限运行。
  • 您的方法没有正确设置必要的注册表项HKEY_CURRENT_USER.

解决这些问题的替代实现:

public class FileAssociation
{
    public string Extension { get; set; }
    public string ProgId { get; set; }
    public string FileTypeDescription { get; set; }
    public string ExecutableFilePath { get; set; }
}

public static class FileAssociations
{
    static FileAssociations()
    {
        SetDllDirectory(Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName));
    }

    [DllImport("shell32.dll", CharSet = CharSet.Unicode)]
    extern static int SHChangeNotify(int wEventId, int uFlags, IntPtr dwItem1, IntPtr dwItem2);
    const int SHCNE_ASSOCCHANGED = 0x8000000;
    const int SHCNF_FLUSH = 0x1000;

    public static void EnsureAssociationsSet(params FileAssociation[] associations)
    {
        var changesMade = false;
        foreach (var association in associations)
        {
            changesMade |= SetAssociation(
                association.Extension,
                association.ProgId,
                association.FileTypeDescription,
                association.ExecutableFilePath);
        }

        if (changesMade)
            SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, IntPtr.Zero, IntPtr.Zero);
    }

    public static bool SetAssociation(string extension, string progId, string fileTypeDescription, string applicationFilePath)
    {
        var changesMade = false;
        using (RegistryKey extensionKey = RegistryKey.CurrentUser.CreateSubKey($@"Software\Classes\{extension}"))
        {
            changesMade |= SetKeyDefaultValue(extensionKey, null, progId);
        }

        using (RegistryKey progIdKey = RegistryKey.CurrentUser.CreateSubKey($@"Software\Classes\{progId}"))
        {
            changesMade |= SetKeyDefaultValue(progIdKey, null, fileTypeDescription);
            changesMade |= SetKeyDefaultValue(progIdKey.CreateSubKey(@"shell\open\command"), null, $"\"{applicationFilePath}\" \"%1\"");
        }

        return changesMade;
    }

    static bool SetKeyDefaultValue(RegistryKey key, string name, object value)
    {
        var originalValue = key.GetValue(name);
        if (value == null)
        {
            if (originalValue == null)
                return false;
            key.DeleteValue(name);
            return true;
        }

        if (value is string && originalValue is string && (string)value == (string)originalValue)
            return false;

        key.SetValue(name, value);
        return true;
    }
}
登录后复制

以上是如何在 C# 中可靠地将文件扩展名与应用程序关联起来?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板