"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo puedo asociar programáticamente una extensión de archivo con mi aplicación en Windows sin usar un instalador?

¿Cómo puedo asociar programáticamente una extensión de archivo con mi aplicación en Windows sin usar un instalador?

Publicado el 2025-04-08
Navegar:435

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

asociar extensiones de archivo con la aplicación

]]

Al desarrollar aplicaciones que editen un tipo de archivo específico, generalmente es necesario asociarlo como el editor predeterminado para ese tipo de archivo. Aquí hay una solución confiable para lograr esto sin usar el instalador.

Implementación del método de asociación:

El código proporcionado por

intenta asociar archivos manipulando el registro. Sin embargo, contiene varias preguntas:
  1. Abre el registro del usuario actual sin especificar permisos de lectura y escritura, lo que puede evitar que la clave se modifique con éxito.
  2. usa CreateSubkey en lugar de OpenSubkey para crear una subterránea de shell, que falla si la subpuesta ya existe.

Código de asociación modificado:

La siguiente es una versión modificada del código que resuelve estos 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);
}

Ejemplo de uso:

Para asociar la extensión del archivo .ucs con una aplicación llamada "Editor UCS", puede usar este código:
SetAssociation(".ucs", "UCS_Editor_File", "UCS File", Application.ExecutablePath);

otras precauciones:

  • Asegúrese de que Ejecutable apunte al ejecutable real, no al acceso directo o ejecutable agrupado.
  • Si la extensión del archivo no está registrada en el registro, es necesario crear su clave correspondiente antes de configurar la asociación.
  • use el método EnsureAseSociationsSet para establecer automáticamente asociaciones de múltiples tipos de archivos.

Esta respuesta revisada mantiene la imagen original y utiliza un lenguaje más descriptivo al tiempo que reestructura el texto para mejorar la claridad y el flujo. El código también está formateado para una mejor legibilidad.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3