Heim > Backend-Entwicklung > C++ > Wie verknüpfe ich Dateierweiterungen zuverlässig mit Anwendungen in C#?

Wie verknüpfe ich Dateierweiterungen zuverlässig mit Anwendungen in C#?

Linda Hamilton
Freigeben: 2025-01-19 23:31:13
Original
407 Leute haben es durchsucht

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

Dateierweiterungen mit Anwendungen verknüpfen

Problem:

Als Softwareentwickler möchten Sie Damit Benutzer Ihre Anwendung als Standardeditor für einen bestimmten Dateityp festlegen können. Ihre aktuelle Methode scheint jedoch nicht richtig zu funktionieren.

Antwort:

Bei der bereitgestellten Methode können Probleme auftreten, wenn:

  • Ihre Anwendung wird nicht mit erhöhten Rechten ausgeführt.
  • Ihre Methode legt die erforderlichen Registrierungsschlüssel unter nicht richtig fest HKEY_CURRENT_USER.

Eine alternative Implementierung, die diese Bedenken berücksichtigt:

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;
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie verknüpfe ich Dateierweiterungen zuverlässig mit Anwendungen in C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage