Maison > développement back-end > C++ > Comment associer de manière fiable des extensions de fichiers à des applications en C# ?

Comment associer de manière fiable des extensions de fichiers à des applications en C# ?

Linda Hamilton
Libérer: 2025-01-19 23:31:13
original
407 Les gens l'ont consulté

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

Association des extensions de fichiers à des applications

Problème :

En tant que développeur de logiciels, vous souhaitez pour permettre aux utilisateurs de définir votre application comme éditeur par défaut pour un type de fichier spécifique. Cependant, votre méthode actuelle ne semble pas fonctionner correctement.

Réponse :

La méthode fournie peut rencontrer des problèmes si :

  • Votre application ne s'exécute pas avec des privilèges élevés.
  • Votre méthode ne définit pas correctement les clés de registre nécessaires sous HKEY_CURRENT_USER.

Une implémentation alternative qui répond à ces préoccupations :

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;
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal