"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como posso associar programaticamente uma extensão de arquivo ao meu aplicativo no Windows sem usar um instalador?

Como posso associar programaticamente uma extensão de arquivo ao meu aplicativo no Windows sem usar um instalador?

Postado em 2025-04-08
Navegar:298

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

associar extensões de arquivo com o aplicativo

]

Ao desenvolver aplicativos que editam um tipo de arquivo específico, geralmente é necessário associá -lo como o editor padrão para esse tipo de arquivo. Aqui está uma solução confiável para conseguir isso sem usar o instalador.

implementação do método da associação:

O código fornecido por

tenta associar arquivos manipulando o registro. No entanto, ele contém várias perguntas:
  1. abre o registro do usuário atual sem especificar permissões de leitura e gravação, o que pode impedir que a chave seja modificada com sucesso.
  2. usa CreateSubkey em vez do OpenSubkey para criar uma subchave do shell, que falha se a subchave já existir.

Código de associação modificado:

a seguir é uma versão modificada do código que resolve esses problemas:
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);
}

Exemplo de uso:

Para associar a extensão do arquivo .ucs a um aplicativo chamado "editor UCS", você pode usar este código:
SetAssociation(".ucs", "UCS_Editor_File", "UCS File", Application.ExecutablePath);

Outras precauções:

    Verifique se o ExecutabablePath aponta para o executável real, não o atalho ou executável agrupado.
  • Se a extensão do arquivo não estiver registrada no registro, será necessário criar sua chave correspondente antes de configurar a associação.
  • use o método EnsureSsociationsset para definir automaticamente associações de vários tipos de arquivos.
Esta resposta revisada mantém a imagem original e usa uma linguagem mais descritiva durante a reestruturação do texto para maior clareza e fluxo. O código também é formatado para melhor legibilidade.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3