Cómo cambiar la asociación de tipo de archivo en el registro?
-
23-08-2019 - |
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?
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 .