2009-07-04 75 views
12

首次在StackOverflow中发布。 :D 我需要我的软件在注册表中添加一些东西。如何更改注册表中的文件类型关联?

我的程序将使用

Process.Start(@"blblabla.smc");

启动的文件,但问题是,最有可能的用户不会有程序设置为特定的文件扩展默认的应用程序。

我如何添加文件关联到WindowsRegistry?

回答

28

除了已经提供的答案,你可以通过调用命令行程序“ASSOC”和“FTYPE”做到这一点。 FTYPE将文件类型与程序关联。 ASSOC将文件扩展名与通过FTYPE指定的文件类型相关联。例如:

FTYPE SMCFile="C:\some_path\SMCProgram.exe" -some_option %1 %* 
ASSOC .smc=SMCFile 

这将使在注册表中必要的条目。有关更多信息,请在命令提示符处键入ASSOC /?FTYPE /?

1

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

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

我在我的宠物项目中有一些C#代码,它查找PDF文件的绑定并在其上下文菜单中添加一个额外的选项。请随时致电have a look

8

Microsoft.Win32中使用Registry类。

具体来说,你想要的RegistryClassesRoot属性来访问HKEY_CLASSES_ROOT键(参见Understanding MS Windows File AssociationsHKEY_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"); 
+0

我有这样的代码: “处理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

3

使用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) 
相关问题