Как изменить ассоциацию типов файлов в реестре?
-
23-08-2019 - |
Вопрос
первая публикация в StackOverflow.:D Мне нужно, чтобы мое программное обеспечение добавило пару вещей в реестр.
Моя программа будет использовать
Process.Start(@"blblabla.smc");
чтобы запустить файл, но проблема в том, что, скорее всего, у пользователя не будет программы, установленной в качестве приложения по умолчанию для конкретного расширения файла.
Как я могу добавить ассоциации файлов в WindowsRegistry?
Решение
В дополнение к уже предоставленным ответам, вы можете выполнить это, вызвав программы командной строки "ASSOC" и "FTYPE".FTYPE связывает тип файла с программой.ASSOC связывает расширение файла с типом файла, указанным через FTYPE.Например:
FTYPE SMCFile="C:\some_path\SMCProgram.exe" -some_option %1 %*
ASSOC .smc=SMCFile
Это позволит внести необходимые записи в реестр.Для получения дополнительной информации введите ASSOC /?
или FTYPE /?
в командной строке.
Другие советы
Используйте Registry
класс в Microsoft.Win32
.
В частности, вы хотите, чтобы ClassesRoot
свойство Registry
чтобы получить доступ к HKEY_CLASSES_ROOT
ключ (ср. Понимание ассоциаций файлов MS Windows и HKEY_CLASSES_ROOT HKEY_CLASSES_ROOT:Основные услуги).
using Microsoft.Win32;
Registry
.ClassesRoot
.CreateSubKey(".smc")
.SetValue("", "SMC", RegistryValueKind.String);
Registry
.ClassesRoot
.CreateSubKey("SMC\shell\open\command")
.SetValue("", "SMCProcessor \"%1\"", RegistryValueKind.String);
Заменить "SMCProcessor \"%1\""
с указанием пути командной строки и спецификации аргументов для программы, которую вы хотите связать с файлами с расширением .smc
.
Но вместо того, чтобы возиться с реестром, почему бы просто не сказать
Process.Start("SMCProcessor blblabla.smc");
Использование 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
Связывание значка с типом расширения:
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"
Зарегистрируйте расширение как исполняемый тип (т.е.ТЕКСТ ПУТИ):
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"
Кроме того, чтобы распознать текст пути без повторного входа в систему, вы можете обновить среду:(спасибо Enthought за это)
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)
Если вы планируете предоставить установщик для своего приложения, просто используйте функцию сопоставления файлов, доступную в любой среде установки, которую вы решите использовать - даже проект установки Visual Studio знает, как это сделать.
Чтобы изменить ассоциации типов файлов непосредственно из вашего кода, я полагаю, вам нужно изучить HKEY_CLASSES_ROOT
и найдите / создайте ключ с расширением, к которому вы хотите привязаться (т.Е. ".pdf").Внутри этого ключа значением по умолчанию является строка, содержащая ссылку на другой ключ внутри HKEY_CLASSES_ROOT
.Следуйте за этим указателем, разверните / создайте shell
раздел и добавляйте / изменяйте свои команды здесь.Осмотрите эту область с regedit
чтобы получить представление о том, как это выглядит.
У меня есть некоторый код на C # в моем любимом проекте, который ищет привязку для PDF-файлов и добавляет дополнительную опцию в их контекстные меню.Не стесняйтесь взгляните на.