win10默认应用研究
按之前经验,一个指定后缀文件(比如.pdf)的右键菜单中选择Open时的打开方式也就有以下几种方式:
如果HKEY_CLASSES_ROOT\.pdf
中默认的key下没有值(相当于别名),则使用 HKEY_CLASSES_ROOT\.pdf\shell\open\command
如果HKEY_CLASSES_ROOT\.pdf
中默认的key有值,例: FakeExamplePdf
,则去查找HKEY_CLASSES_ROOT\FakeExamplePdf
下的定义的shell\open\command
中的内容。
还有一种基于CLSID指定的打开方式。
以上取出最终的命令行格式后,使用当前文件的路径替换命令行中的 %1 并执行,以启用程序实现打开功能。
但近期在win10中发现例外了,把注册表中的.pdf
删除也不影响双击自动执行。并且我的Dos命令 assoc
里也没显示pdf。
PS: HKEY_CLASSES_ROOT
等同于 HKEY_LOCAL_MACHINE\SOFTWARE\Classes
,所以后文会有部分混用。
控制面板
先看看控制面板中是怎么设置默认应用的,可以看到这里的设置基本上分为以下几种:
1、选择可以当作默认应用的软件,点击进去看看该软件支持哪些后缀或链接协议格式,然后单独设置。(默认浏览器作为一项特殊的设置在某些应用里单独列出来)
image.png
2、选择后缀或协议,然后以列表方式选择支持该后缀或协议的软件。
image.png应用列表的数据来源
- HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications 中记录着当前计算机上有哪些注册了可以被设置为默认程序的应用程序。值是是对应注册表路径,以Capbilities结尾。在该注册表下有描述该程序所绑定的后缀、协议、打开方式等。
- 有一些Microsoft Store里下载的UWP应用,但这个定义暂时不知道是在哪里定义的,这要看下UWP开发的一些资料了(后续再研究)
Capbilities 结构
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\Microsoft Edge]
@="Microsoft Edge"
[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\Microsoft Edge\Capabilities]
"ApplicationDescription"="Microsoft Edge 是以闪电速度运行网页和应用程序的 Web 浏览器。它快速、稳定而且易于使用。通过 Microsoft Edge 中内置的恶意软件和网络钓鱼防护可以更安全地浏览网站。"
"ApplicationIcon"="C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe,0"
"ApplicationName"="Microsoft Edge"
[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\Microsoft Edge\Capabilities\FileAssociations]
".htm"="MSEdgeHTM"
".html"="MSEdgeHTM"
".shtml"="MSEdgeHTM"
".svg"="MSEdgeHTM"
".xht"="MSEdgeHTM"
".xhtml"="MSEdgeHTM"
".webp"="MSEdgeHTM"
".pdf"="MSEdgePDF"
".mht"="MSEdgeMHT"
".mhtml"="MSEdgeMHT"
".xml"="MSEdgeHTM"
[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\Microsoft Edge\Capabilities\Startmenu]
"StartMenuInternet"="Microsoft Edge"
[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\Microsoft Edge\Capabilities\URLAssociations]
"ftp"="MSEdgeHTM"
"http"="MSEdgeHTM"
"https"="MSEdgeHTM"
"irc"="MSEdgeHTM"
"mailto"="MSEdgeHTM"
"mms"="MSEdgeHTM"
"news"="MSEdgeHTM"
"nntp"="MSEdgeHTM"
"read"="MSEdgeHTM"
"sms"="MSEdgeHTM"
"smsto"="MSEdgeHTM"
"snews"="MSEdgeHTM"
"tel"="MSEdgeHTM"
"urn"="MSEdgeHTM"
"webcal"="MSEdgeHTM"
"microsoft-edge"="MSEdgeHTM"
"microsoft-edge-holographic"="MSEdgeHTM"
"ms-xbl-3d8b930f"="MSEdgeHTM"
[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\Microsoft Edge\DefaultIcon]
@="C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe,0"
[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\Microsoft Edge\InstallInfo]
"ReinstallCommand"="\"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe\" --make-default-browser"
"HideIconsCommand"="\"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe\" --hide-icons"
"ShowIconsCommand"="\"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe\" --show-icons"
"IconsVisible"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\Microsoft Edge\shell]
[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\Microsoft Edge\shell\open]
[HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\Microsoft Edge\shell\open\command]
@="\"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe\""
可以看到Capabilities\URLAssociationst
和Capabilities\FileAssociations
中的列表,和控制面板中点击该应用时的“默认文件类型或链接类型”显示一致,FileAssociations中给.pdf
定义了MSEdgePDF的值,而该值对应HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MSEdgePDF
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MSEdgePDF]
@="Microsoft Edge PDF Document"
"AppUserModelId"="MSEdge"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MSEdgePDF\Application]
"AppUserModelId"="MSEdge"
"ApplicationIcon"="C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe,0"
"ApplicationName"="Microsoft Edge"
"ApplicationDescription"="浏览 Web"
"ApplicationCompany"="Microsoft Corporation"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MSEdgePDF\DefaultIcon]
@="C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe,13"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MSEdgePDF\shell]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MSEdgePDF\shell\open]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MSEdgePDF\shell\open\command]
@="\"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe\" --single-argument %1"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MSEdgePDF\shell\runas]
"ProgrammaticAccessOnly"=""
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MSEdgePDF\shell\runas\command]
@="\"C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe\" --do-not-de-elevate --single-argument %1"
呐,这里就有熟悉的 shell\open\command
了。但现在就只有一个疑问,控制面板设置的打开方式,能否使用注册表查询的到?
查看HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.pdf
这里的 UserChoice 记录了用户在控制面板中的对文件后缀的选择
其下有两个子键:
Hash和ProgId,ProgId在本例中就是MSEdgePDF。Hash是一个验证字段,避免恶意程序修改。
而HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations
中记录了对链接类型的默认程序选择。
其它知识:
使用Dism.exe /online /Export-DefaultAppAssociations:FileAssos.xml
命令可以打印出当前系统上所有文件绑定的默认打开方式。
比如:<Association Identifier=".pdf" ProgId="MSEdgePDF" ApplicationName="Microsoft Edge" />
众所周知,Windows 10会在每次更新后通过更改文件类型关联来重置默认应用程序。要解决此问题,您可以做的最好的事情是备份文件类型关联,并在发现Windows 10更新弄乱它们后将其还原。