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:
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; } }
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!