Pregunta

primer destino vez en StackOverflow. :RE Necesito mi software para agregar un par de cosas en el registro.

Mi programa utilizará

  

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

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

¿Cómo puedo añadir asociaciones de archivos a la WindowsRegistry?

¿Fue útil?

Solución

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 al tipo de archivo especificado a través FTYPE. Por ejemplo:

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

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

Otros consejos

Utilice la href="http://msdn.microsoft.com/en-us/library/microsoft.win32.registry.aspx" rel="noreferrer"> Registry clase Microsoft.Win32 .

En concreto, desea que el ClassesRoot característica de Registry para acceder a la HKEY_CLASSES_ROOT clave (cf. entender asociaciones de archivos de MS Windows 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.

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

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

El uso de 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 conseguir PATHEXT reconocido sin necesidad de acceder de nuevo puede actualizar el medio ambiente: (gracias a Enthought para esto)

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)

Si está pensando en proporcionar un instalador para su aplicación, sólo tiene que utilizar la función de asociación de archivos disponibles en cualquier marco instalador decide utilizar -. Incluso el proyecto de instalación de Visual Studio sabe cómo hacer esto

Para modificar las asociaciones de tipos de archivos directamente desde el código, creo que usted tiene que mirar en HKEY_CLASSES_ROOT y encontrar / crear una clave con la extensión que desea unirse a (es decir, ".pdf"). Dentro de esta clave, el valor predeterminado es una cadena que contiene una referencia a otra de las claves dentro HKEY_CLASSES_ROOT. Ir siga ese puntero, expandir / crear la subclave shell y añadir / cambiar sus comandos aquí. Mire alrededor de esta área con regedit para obtener el fealing de cómo se ve.

Tengo algo de código C # en un proyecto favorito de la mía, que busca la unión de los archivos PDF y añade una opción adicional para sus menús de contexto. No dude en echar un vistazo .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top