如何变化的文件类型的协会的注册?
-
23-08-2019 - |
题
第一次张贴在计算器.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
关键(cf。 了解MS Windows文件协会 和 注册表:核心服务).
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"
注册扩展作为可执行类型(即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"
此外,获得认可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
这方面得到它的外观的fealing。
我在我的一个宠物项目,该项目中查找约束力的PDF文件,并增加了一个额外的选项,其上下文菜单的一些C#代码。随意看看。