Windows 文件关联的注册表设置
2024-11-23 10:28:28
今天碰到一个系统文件关联的问题,经过反复试验后总结的一点经验。
从一个文件启动关联应用分为两步:
- 查找扩展名的 ProgId。
- 查找 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 | // 1. |
命令行工具
CMD 中有个ftype
命令可以设置启动命令行:
1 | ftype MyProgId=app.exe %1 |
它会向HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MyProgId\Shell\Open\Command
默认键写入命令行。
打开方式中推荐应用的顺序
双击文件后如果没有找到关联的应用去启动它,Windows 则会弹出打开方式
的窗口,在这个窗口中会有一个推荐列表。
推荐应用列表是一个 ProgId 的集合,每个推荐项用一个英文字母表示,然后由MRUList
属性来决定顺序:
1 | [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\{Ext}\OpenWithList] |
这个推荐列表顺序是dcba
,但是因为b
的 ProgId 中没有句号.
,就不会出现在推荐列表中,这是我测试发现的。所以 ProgId 一般将用程序的文件名。