Windows 文件关联的注册表设置
2024-11-23 10:28:28

今天碰到一个系统文件关联的问题,经过反复试验后总结的一点经验。
从一个文件启动关联应用分为两步:

  1. 查找扩展名的 ProgId。
  2. 查找 ProgId 中的命令行并运行。

查找关联应用的 ProgId

第1个搜索位置:

1
HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\{Ext}\UserChoice\ProgId

如果用户通过打开方式选择过关联应用,则这个值的权限好像就会是 SYSTEM(未验证),无法用正常手段编辑或删除,这是为了安全考虑,防止程序乱搞用户的关联设置。


第2个搜索位置:

1
HKCR\{Ext}

默认值就是 ProgId。
同时在 HKEY_CURRENT_USER 中存在一个它的符号链接HKCU\SOFTWARE\Classes\{Ext},访问这里也是一样的。


第3个搜索位置:

1
HKLM\SOFTWARE\Classes\{Ext}

默认值就是 ProgId。

命令行工具

CMD 中有一个用于查看、设置 ProgId 的命令工具assoc,在这个工具中将 ProgId 称为 filetype,是一回事。
查看 .zip 文件的 ProgId:

1
assoc .zip

但它只会返回 HKEY_LOCAL_MACHINE 注册表中的值,可能与实际不符。
同样,设置也是写 HKEY_LOCAL_MACHINE 注册表

1
assoc .zip=Bandizip.zip

因为 HKCU 优先级高于 HKLM,所以可能并不会生效。

查找启动命令

在得到 ProgId 后,依次从以下位置获取启动命令行:

1
2
3
4
5
6
// 1.
HKCU\SOFTWARE\Classes\Applications\{ProgId}\shell\open\command

// 2.
// 软链接: HKLM\SOFTWARE\Classes\Applications\{ProgId}\shell\open\command
HKCR\Applications\{ProgId}\shell\open\command

命令行工具

CMD 中有个ftype命令可以设置启动命令行:

1
ftype MyProgId=app.exe %1

它会向HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MyProgId\Shell\Open\Command默认键写入命令行。

打开方式中推荐应用的顺序

双击文件后如果没有找到关联的应用去启动它,Windows 则会弹出打开方式的窗口,在这个窗口中会有一个推荐列表。
推荐应用列表是一个 ProgId 的集合,每个推荐项用一个英文字母表示,然后由MRUList属性来决定顺序:

1
2
3
4
5
6
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\{Ext}\OpenWithList]
"a"="notepad++.exe"
"b"="AAA"
"c"="DocBox.exe"
"d"="dopus.exe"
"MRUList"="dcba"

这个推荐列表顺序是dcba,但是因为b的 ProgId 中没有句号.,就不会出现在推荐列表中,这是我测试发现的。所以 ProgId 一般将用程序的文件名。