首次在StackOverflow中发布。 :D 我需要我的软件在注册表中添加一些东西。如何更改注册表中的文件类型关联?
我的程序将使用
Process.Start(@"blblabla.smc");
启动的文件,但问题是,最有可能的用户不会有程序设置为特定的文件扩展默认的应用程序。
我如何添加文件关联到WindowsRegistry?
首次在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 /?
。
如果您打算为您的应用程序提供安装程序,只需使用您选择使用的任何安装程序框架中提供的文件关联功能即使Visual Studio安装项目也知道如何执行此操作。
要直接从您的代码中更改文件类型关联,我相信您必须查看HKEY_CLASSES_ROOT
并找到/创建要绑定到的扩展名(例如“.pdf”)的密钥。在此密钥内,默认值是一个字符串,其中包含对HKEY_CLASSES_ROOT
内另一个密钥的引用。请按照该指针,展开/创建shell
子项并在此处添加/更改您的命令。通过regedit
查看这个区域,以了解它的外观。
我在我的宠物项目中有一些C#代码,它查找PDF文件的绑定并在其上下文菜单中添加一个额外的选项。请随时致电have a look。
在Microsoft.Win32
中使用Registry
类。
具体来说,你想要的Registry
的ClassesRoot
属性来访问HKEY_CLASSES_ROOT
键(参见Understanding MS Windows File Associations和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);
更换"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,你可以更新环境:(感谢Enthough吨此)
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)
我有这样的代码: “处理EmulatorProcess; EmulatorProcess = Process.Start(@“C:\ Documents and Settings \ serg \ Desktop \ Emubox v0.01 \ SuperNintendo \ Roms \ Super Mario RPG(U).smc”); EmulatorProcess.WaitForInputIdle();' 我用硬编码的路径来测试一下。我怎么能将你的最后一行代码应用于我的需求?谢谢! :D – 2009-07-04 20:45:26