Maison > développement back-end > C++ > Comment puis-je associer par programme une extension de fichier à mon application sous Windows sans utiliser de programme d'installation ?

Comment puis-je associer par programme une extension de fichier à mon application sous Windows sans utiliser de programme d'installation ?

Mary-Kate Olsen
Libérer: 2025-01-19 23:46:09
original
533 Les gens l'ont consulté

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

Associer une extension de fichier à une application

Lors du développement d'une application qui édite un type de fichier spécifique, il est souvent nécessaire de l'associer à l'éditeur par défaut pour ce type de fichier. Voici une solution solide pour y parvenir sans utiliser d'installateur.

Mise en place de la méthode d'association :

Le code fourni tente d'associer des fichiers en manipulant le registre. Cependant, il contient plusieurs problèmes :

  1. Il ouvre le registre de l'utilisateur actuel sans spécifier les autorisations de lecture et d'écriture, ce qui peut empêcher la modification réussie des clés.
  2. Il utilise CreateSubKey au lieu d'OpenSubKey pour créer la sous-clé du shell et échoue si la sous-clé existe déjà.

Code association modifié :

Voici une version modifiée du code qui résout ces problèmes :

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

Exemple d'utilisation :

Pour associer l'extension de fichier .ucs à une application appelée "UCS Editor", vous pouvez utiliser ce code :

<code class="language-csharp">SetAssociation(".ucs", "UCS_Editor_File", "UCS File", Application.ExecutablePath);</code>
Copier après la connexion

Autres notes :

  • Assurez-vous que executablePath pointe vers l'exécutable réel, et non vers un raccourci ou un exécutable fourni.
  • Si l'extension de fichier n'est pas déjà enregistrée dans le registre, sa clé correspondante doit être créée avant de créer l'association.
  • Utilisez la méthode EnsureAssociationsSet pour définir automatiquement des associations pour plusieurs types de fichiers.

Cette réponse révisée conserve l'image originale et utilise un langage plus descriptif tout en restructurant le texte pour une clarté et une fluidité améliorées. Le code est également formaté pour une meilleure lisibilité.

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