前言:
我的电脑安装了三款可以查看pdf的软件,分别是Foxit Reader,WPS和2345看图王,平时我最惯用的Foxit Reader(这就是个PDF阅读器,我不用它看PDF还下他干嘛- -),但是在平时的使用过程中,发现2345看图王很不老实,隔几天就自动把自己设为默认的PDF打开方式,每次这样我都要去win10的设置里手动更改打开方式,后来觉得很麻烦,就去查了一下默认打开方式在注册表中的存储原理,从根本上解决这个问题。
另外,WPS也不太老实,每次更新完之后也会把自己设为默认的PDF查看器,不过还是比2345看图王这种隔几天就自查一下的要强很多。
原理:
(不想看的可以直接看下面的方法部分)
Windows10中对于某种扩展名的文件的默认的打开方式是这样存储的。
1.在HKEY_CLASSES_ROOT\中直接存储以扩展名为项名的项。
以我要找的pdf为例,该项为
HKEY_CLASSES_ROOT\.pdf
如下图所示- 可以看到,在这一项中,存在一个名为(默认)的字符串值,数据为2345pic.pdf。
- 这个数据创建了一个映射,将扩展名为pdf的文件映射为名为2345pic.pdf的文件,这样的结果有两个:
一个是为windos下一步寻找具体的打开软件做基础;
二是提供了文件种类的名字。具体的效果就是我们在资源管理器里查看pdf文件的时候,下面灰色的种类名显示的不是“PDF”或“PDF文件”,而是“看图王PDF文件”,如下图所示。当然,从“2345pic.pdf”到“看图王PDF文件”还有一层映射关系,在这里我们暂且不关心,我们关心的只是文件类型和打开方式的映射关系。
同样的原理,如果我们将这个名为“默认”的字符串值更改为KWPS.PDF.9,那么图中的灰色字很可能就会显示为诸如“WPSPDF文件”一类的名字。
那么有了这个文件类型名,windows如何将它与实际显示的文件类型以及打开方式对应起来呢,这就涉及到第二步。
2.同样在HKEY_CLASSES_ROOT\中存储一个名为某种文件类型名的项。以2345pic.pdf为例:
\HKEY_CLASSES_ROOT\2345Pic.pdf
如下图所示:这一项为windows提供下一级映射,即文件类型名和在资源管理中显示的文件类型以及打开软件的映射。
在图中可以看到,这一项中有一个名为(默认)的字符串值,这个值的数据正是在资源管理器中显示的pdf文件的类型。
在这一项的目录下,还有一个名为DefaultIcon的项,顾名思义,这一项中存储的是该类型文件的默认显示图标。
而我们最关心的东西在2345pic.pdf/shell/open/command这一项中。
如下图:
command项中有一个名为“(默认)”的字符串值,这个值的数据就是用于打开该类型文件的程序的地址。在这个地方由于我已经改过了,所以是我的FoxitReader的地址。
小结:
windows对于某特定扩展名的文件,先在HKEY_CLASSES_ROOT\中寻找以扩展名为项名的项,读取这一项的默认字符串值的数据作为文件类型名,再在HKEY_CLASSES_ROOT\中寻找以该文件类型名为项名的项,从中读出该种文件的各种信息,包括显示文件类型名,图标,打开程序等。
操作方法:
1.按Win+R快捷键,打开“运行”,在其中输入regedit,打开注册表编辑器
(或者用cmd进入也可以,基础操作见仁见智)
2.找到
HKEY_CLASSES_ROOT\.pdf
3.双击右边窗口中的(默认),就是红色的ab图标右边的(默认)。
5.找到
HKEY_CLASSES_ROOT\刚刚复制的文字\shell\open\command
在本例中,即为
HKEY_CLASSES_ROOT\2345Pic.pdf\shell\open\command
6.双击右边窗口中的(默认),和第3步相同,将第一个双引号中的内容更改为你自己喜欢的程序的完整路径,第二个引号即 "%1" 保留,不要做任何更改。两串引号中间有一个空格也要保留。
7.单击“确定”,然后按F5刷新注册表。退出注册表,现在再去打开pdf文件,尽管此时文件的类型仍然显示为看图王PDF文件,图标也是看图王的图标,但是打开之后却是FoxitReader。成功!
进阶:
之后要做的事就是增加一个开机启动项,让系统每次开机都重新将我们刚刚做的步骤再做一遍,以防止注册表中的内容被软件再篡改回去,这一部分内容网上已经有很多教程, 如下几篇文章可作为参考:
另外,将对这项所做的工作对WPS对应的项KWPS.PDF.9如法炮制,以防止每次WPS更新后再次将自己设为PDF的默认软件。同样将这个注册表项导出并添加到启动项中。
同理,可用这种方法修改其他类型文件的默认打开方式。(前提是遇到了很不讲理的流氓软件,但是又因为某些原因不想卸载的情况,正常情况还是应该用Windows自带的设置去改。)