12

第一次在 StackOverflow 上发帖。:D 我需要我的软件在注册表中添加一些东西。

我的程序将使用

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

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

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

4

4 回答 4

28

除了已经提供的答案之外,您还可以通过调用命令行程序“ASSOC”和“FTYPE”来完成此操作。FTYPE 将文件类型与程序相关联。ASSOC 将文件扩展名与通过 FTYPE 指定的文件类型相关联。例如:

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

这将在注册表中创建必要的条目。有关详细信息,请在命令提示符处键入ASSOC /?或。FTYPE /?

于 2009-07-04T20:47:35.173 回答
8

使用 中的RegistryMicrosoft.Win32

具体来说,您希望访问密钥的ClassesRoot属性(参见了解 MS Windows 文件关联HKEY_CLASSES_ROOT:核心服务)。RegistryHKEY_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");
于 2009-07-04T20:27:38.817 回答
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,您可以更新环境:(感谢 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)
于 2010-06-16T11:08:39.140 回答
1

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

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

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

于 2009-07-04T20:19:13.483 回答