如何在注册表中更改文件类型关联?

第一次在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 /? 在命令提示符下。

使用Microsoft.Win32Registry类。

具体来说,您希望RegistryClassesRoot属性访问HKEY_CLASSES_ROOT键(参见了解MS Windows文件关联和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" 

将扩展名注册为可执行类型(即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) 

如果您计划为应用程序提供安装程序,只需使用您选择使用的任何安装程序框架中提供的文件关联function – 即使Visual Studio安装程序项目也知道如何执行此操作。

要直接从您的代码更改文件类型关联,我相信您必须查看HKEY_CLASSES_ROOT并查找/创建一个包含您要绑定的扩展名的键(即“.pdf”)。 在此键中,默认值是一个字符串,其中包含对HKEY_CLASSES_ROOT内另一个键的引用。 按照该指针,展开/创建shell子项并在此处添加/更改命令。 用regedit环顾这个区域,以了解它的外观。

我在我的宠物项目中有一些C#代码,它查找PDF文件的绑定并为其上下文菜单添加一个额外的选项。 随意看看 。