Heim > Backend-Entwicklung > C++ > Wie kann ich meiner Anwendung in Windows programmgesteuert eine Dateierweiterung zuordnen, ohne ein Installationsprogramm zu verwenden?

Wie kann ich meiner Anwendung in Windows programmgesteuert eine Dateierweiterung zuordnen, ohne ein Installationsprogramm zu verwenden?

Mary-Kate Olsen
Freigeben: 2025-01-19 23:46:09
Original
533 Leute haben es durchsucht

How can I programmatically associate a file extension with my application in Windows without using an installer?

Verknüpfen Sie eine Dateierweiterung mit einer Anwendung

Wenn Sie eine Anwendung entwickeln, die einen bestimmten Dateityp bearbeitet, ist es häufig erforderlich, diese mit dem Standardeditor für diesen Dateityp zu verknüpfen. Hier finden Sie eine solide Lösung, wie Sie dies ohne Verwendung eines Installationsprogramms erreichen können.

Implementierung der Assoziationsmethode:

Der bereitgestellte Code versucht, Dateien durch Manipulation der Registrierung zuzuordnen. Es enthält jedoch mehrere Probleme:

  1. Es öffnet die Registrierung des aktuellen Benutzers, ohne Lese- und Schreibberechtigungen anzugeben, was eine erfolgreiche Änderung der Schlüssel verhindern kann.
  2. Es verwendet CreateSubKey anstelle von OpenSubKey, um den Shell-Unterschlüssel zu erstellen, und schlägt fehl, wenn der Unterschlüssel bereits vorhanden ist.

Geänderter Assoziationscode:

Hier ist eine modifizierte Version des Codes, die diese Probleme löst:

<code class="language-csharp">public static void SetAssociation(string extension, string keyName, string fileDescription, string executablePath)
{
    // 以读写权限打开当前用户的注册表
    using (RegistryKey currentUser = Registry.CurrentUser.OpenSubKey(@"HKEY_CURRENT_USER", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl))
    {
        using (RegistryKey baseKey = currentUser.CreateSubKey(extension))
        {
            baseKey.SetValue("", keyName);
        }

        using (RegistryKey openMethodKey = currentUser.CreateSubKey(keyName))
        {
            openMethodKey.SetValue("", fileDescription);

            // 如果“DefaultIcon”子密钥不存在,则创建它
            if (openMethodKey.OpenSubKey("DefaultIcon") == null)
            {
                using (RegistryKey defaultIconKey = openMethodKey.CreateSubKey("DefaultIcon"))
                {
                    defaultIconKey.SetValue("", "\"" + executablePath + "\",0");
                }
            }

            // 创建 Shell 子密钥并编辑和打开命令子密钥
            using (RegistryKey shellKey = openMethodKey.CreateSubKey("Shell"))
            {
                using (RegistryKey editKey = shellKey.CreateSubKey("edit"))
                {
                    using (RegistryKey editCommandKey = editKey.CreateSubKey("command"))
                    {
                        editCommandKey.SetValue("", "\"" + executablePath + "\" \"%1\"");
                    }
                }

                using (RegistryKey openKey = shellKey.CreateSubKey("open"))
                {
                    using (RegistryKey openCommandKey = openKey.CreateSubKey("command"))
                    {
                        openCommandKey.SetValue("", "\"" + executablePath + "\" \"%1\"");
                    }
                }
            }
        }

        // 在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts 中设置 ProgId
        using (RegistryKey fileExtsKey = currentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\" + extension))
        {
            fileExtsKey.SetValue("Progid", keyName);
        }
    }

    // 通知资源管理器更改以刷新其文件关联
    SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSH, IntPtr.Zero, IntPtr.Zero);
}</code>
Nach dem Login kopieren

Verwendungsbeispiel:

Um die Dateierweiterung .ucs mit einer Anwendung namens „UCS Editor“ zu verknüpfen, können Sie diesen Code verwenden:

<code class="language-csharp">SetAssociation(".ucs", "UCS_Editor_File", "UCS File", Application.ExecutablePath);</code>
Nach dem Login kopieren

Weitere Hinweise:

  • Stellen Sie sicher, dass der executablePath auf die tatsächliche ausführbare Datei verweist, nicht auf eine Verknüpfung oder eine gebündelte ausführbare Datei.
  • Wenn die Dateierweiterung noch nicht in der Registrierung registriert ist, muss vor dem Einrichten der Zuordnung der entsprechende Schlüssel erstellt werden.
  • Verwenden Sie die Methode „EnsureAssociationsSet“, um automatisch Zuordnungen für mehrere Dateitypen festzulegen.

Diese überarbeitete Antwort behält das Originalbild bei und verwendet eine beschreibendere Sprache, während der Text für mehr Klarheit und Fluss neu strukturiert wird. Der Code ist außerdem für eine bessere Lesbarkeit formatiert.

Das obige ist der detaillierte Inhalt vonWie kann ich meiner Anwendung in Windows programmgesteuert eine Dateierweiterung zuordnen, ohne ein Installationsprogramm zu verwenden?. 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