3 回答
TA贡献2041条经验 获得超4个赞
您可以在此MSDN文章中找到有关该过程的基本概述。关键部分在列表的底部:
注册ProgID
ProgID(本质上是文件类型注册表项)是包含重要文件类型属性的内容,例如图标,描述和上下文菜单项,包括双击文件时使用的应用程序。许多扩展名可能具有相同的文件类型。该映射在下一步中完成:
注册文件类型的文件扩展名
在这里,您可以为扩展名设置一个注册表值,将该扩展名的文件类型设置为您在上一步中创建的ProgID。
要使用您的应用程序打开文件的最低工作量是设置/创建两个注册表项。在此示例.reg文件中,我创建了文件类型(blergcorp.blergapp.v1)并将文件扩展名(.blerg)与其关联。
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Classes\blergcorp.blergapp.v1\shell\open\command]
@="c:\path\to\app.exe \"%1\""
[HKEY_CURRENT_USER\Software\Classes\.blerg]
@="blergcorp.blergapp.v1"
现在,您可能希望以编程方式完成此任务。绝对来说,您可以检查这些键是否存在,并相应地更改程序行为,尤其是在假设您控制某些通用文件扩展名的情况下。但是,可以通过使用SetValue函数设置这两个键来实现该目标。
我对确切的C ++语法不满意,但是在C#中,语法看起来像这样:
Registry.SetValue(@"HKEY_CURRENT_USER\Software\Classes\blergcorp.blergapp.v1\shell\open\command", null, @"c:\path\to\app.exe \"%1\"");
Registry.SetValue(@"HKEY_CURRENT_USER\Software\Classes\.blerg", null, "blergcorp.blergapp.v1");
当然,您可以手动打开每个子键,手动创建ProgID和扩展子键,然后设置键值,但是该SetValue功能的好处是,如果键或值不存在,则会自动创建它们。非常便利。
现在,简短说明使用哪种配置单元。在线上的许多文件关联示例(包括MSDN上的示例)都显示了在中设置的这些密钥HKEY_CLASSES_ROOT。我不建议这样做。该配置单元是HKEY_LOCAL_MACHINE\Software\Classes(系统默认设置)和HKEY_CURRENT_USER\Software\Classes(按用户设置)的合并虚拟视图,并且对配置单元中的任何子项的写入均被重定向到中的相同项HKEY_LOCAL_MACHINE\Software\Classes。现在,这样做没有直接的问题,但是您可能会遇到此问题:如果您写入HKCR(重定向到HKLM),并且用户在HKCU中指定了相同的键且具有不同的值,则HKCU值将优先。因此,您的写入将成功,但是您将看不到任何更改,因为HKEY_CURRENT_USER设置优先于HKEY_LOCAL_MACHINE设置。
因此,在设计应用程序时应考虑到这一点。现在,另一方面,您可以只写HKEY_CURRENT_USER,如我的示例所示。但是,该文件关联设置将仅为当前用户加载,并且如果已为所有用户安装了您的应用程序,则当该其他用户在Windows中打开文件时,您的应用程序将不会启动。
TA贡献1827条经验 获得超8个赞
我不知道为什么人们总是说HKEY_CURRENT_USER\Software\Classes\<.ext>默认值(它将把您重定向到另一个(软件创建的)类)。
它确实有效,但是将被覆盖
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\<.ext>\UserChoice
我相信Microsoft建议第二种做法-因为这是内置的“打开方式”所做的。在这种情况下,Progid“键” 的值等于默认值HKEY_CURRENT_USER\Software\Classes\<.ext>。
- 3 回答
- 0 关注
- 618 浏览
添加回答
举报