2009-07-04 6 views
12

publicación por primera vez en StackOverflow. : D Necesito mi software para agregar un par de cosas en el registro.¿Cómo cambiar la asociación de tipo de archivo en el registro?

Mi programa utilizará

Process.Start(@"blblabla.smc");

para poner en marcha un archivo, pero el problema es que muy probablemente el usuario no tendrá un programa establecido como aplicación por defecto para la extensión de archivo en particular.

¿Cómo puedo agregar asociaciones de archivos a WindowsRegistry?

Respuesta

28

Además de las respuestas que se facilitan, se puede lograr esto llamando a los programas de línea de comando "ASSOC" y "FTYPE". FTYPE asocia un tipo de archivo con un programa. ASSOC asocia una extensión de archivo con el tipo de archivo especificado a través de FTYPE. Por ejemplo:

FTYPE SMCFile="C:\some_path\SMCProgram.exe" -some_option %1 %* 
ASSOC .smc=SMCFile 

Esto hará las entradas necesarias en el registro. Para obtener más información, escriba ASSOC /? o FTYPE /? en el símbolo del sistema.

1

Si planea proporcionar un instalador para su aplicación, simplemente use la función de asociación de archivos disponible en cualquier marco de instalador que elija usar, incluso el proyecto de instalación de Visual Studio sabe cómo hacerlo.

Para alterar asociaciones de tipo de archivo directamente desde su código, creo que debe buscar en HKEY_CLASSES_ROOT y buscar/crear una clave con la extensión que desea vincular (es decir, ".pdf"). Dentro de esta clave, el valor predeterminado es una cadena que contiene una referencia a otra clave dentro de HKEY_CLASSES_ROOT. Ve a seguir ese puntero, expande/crea la subclave shell y agrega/cambia tus comandos aquí. Mire alrededor de esta área con regedit para obtener la sensación de cómo luce.

Tengo un código C# en un proyecto mío favorito, que busca el enlace de los archivos PDF y agrega una opción extra a sus menús contextuales. Siéntase libre de have a look.

8

Utilice la clase Registry en Microsoft.Win32.

Específicamente, desea que la propiedad de ClassesRootRegistry para acceder a la HKEY_CLASSES_ROOT clave (cf. Understanding MS Windows File Associations y HKEY_CLASSES_ROOT: Core Services).

using Microsoft.Win32; 
Registry 
    .ClassesRoot 
    .CreateSubKey(".smc") 
    .SetValue("", "SMC", RegistryValueKind.String); 
Registry 
    .ClassesRoot 
    .CreateSubKey("SMC\shell\open\command") 
    .SetValue("", "SMCProcessor \"%1\"", RegistryValueKind.String); 

Reemplazar "SMCProcessor \"%1\"" con la ruta de línea de comandos y la especificación argumento para el programa que desea asociar con los archivos con extensión .smc.

Pero, en lugar de jugar con el registro, ¿por qué no decir

Process.Start("SMCProcessor blblabla.smc"); 
+0

tengo este código: 'Proceso EmulatorProcess; EmulatorProcess = Process.Start (@ "C: \ Documents and Settings \ serg \ Desktop \ Emubox v0.01 \ SuperNintendo \ Roms \ Super Mario RPG (U) .smc"); EmulatorProcess.WaitForInputIdle(); ' Utilicé un camino codificado solo para probar cosas. ¿Cómo podría aplicar su última línea de código a mis necesidades? ¡Gracias! : D –

+0

De [esta respuesta] (http://stackoverflow.com/a/13535039/1497596): * "La clase' RegistryKey' implementa 'IDisposable' y entonces debe envolver sus claves en una declaración' using'. " * O, como alternativa, debe llamar a [Cerrar o desechar] (http://stackoverflow.com/a/37059244/1497596) en el 'RegistryKey' cuando haya terminado con él. Esto significa que incluir 'CreateSubKey' en una cadena de métodos como se muestra en este ejemplo es una mala idea. – DavidRR

3

Usando Python:

EXT, EXT_TYPE = ".xyz", "XYZ file" 
EXE_PATH = r"path\to\my\exe" 

# %L is the long (full path) version of path 
extCmd = '"%s" "%%L" %%*' % EXE_PATH 

# Using assoc and ftype easier than editing registry! 
assert os.system('assoc %s=%s' % (EXT, EXT_TYPE))==0 
assert os.system('ftype %s=%s' % (EXT_TYPE, extCmd))==0 

Asociar un icono con el tipo de extensión:

import _winreg 

try: 
    ext = _winreg.OpenKey(_winreg.HKEY_CLASSES_ROOT, EXT_TYPE) 
    _winreg.SetValue(ext, "DefaultIcon", _winreg.REG_SZ, ICON_PATH) 
    _winreg.CloseKey(ext) 
except WindowsError: 
    print "Error associating icon" 

registrar la extensión como un tipo de ejecutable (es decir PATHEXT):

try: 
    key = r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment' 

    reg = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) 

    # get current value 
    ext = _winreg.OpenKey(reg, key) 
    pathext = _winreg.QueryValueEx(ext, 'PATHEXT')[0] 

    if not EXT in pathext: 
     _winreg.CloseKey(ext) 

     # modify the current value    
     ext = _winreg.OpenKey(reg, key, 0, _winreg.KEY_ALL_ACCESS) 
     pathext += ';' + EXT 
     _winreg.SetValueEx(ext, 'PATHEXT', 0, _winreg.REG_SZ, pathext) 
     _winreg.CloseKey(ext) 

    _winreg.CloseKey(reg) 

except WindowsError: 
    print "Error adding to PATHEXT" 

Además, para obtener reconocimiento de PATHEXT sin iniciar sesión de nuevo, puede actualizar el entorno: (gracias a Enthough t para este)

def refreshEnvironment():   
    HWND_BROADCAST  = 0xFFFF 
    WM_SETTINGCHANGE = 0x001A 
    SMTO_ABORTIFHUNG = 0x0002 
    sParam    = "Environment" 

    import win32gui 
    res1, res2   = win32gui.SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, sParam, SMTO_ABORTIFHUNG, 100) 
Cuestiones relacionadas