Windows沙拉:默认浏览器背后的故事
2016-04-20 17:06
288 查看
本文转自:/article/5151596.html
作者:linjiet#gmail.com
在Windows系统中很多浏览器中都有设置“默认浏览器”的功能,基本上家家都有。除了浏览器自身的设置外,XP、Win7中也提供了很多方法来设置。特别是Win7中,专门提供了一个叫“默认程序”的设置项。那么,这些设置背后的故事是什么呢?
要研究东西,先要明确它的范围和定义。那么,什么是默认浏览器呢?我总结了下,主要有下面三块内容:
在Windows系统的设计中,一个软件可以有多个扩展名。为了区分不同的软件,因此一个软件(App)就对应一个ProgId(ProgrammaticIdentifiers),而一个扩展名则与一个ProgID相关联。当然,一个App是可以有多个ProgId的,比如说一类来处理文件管理,一类来处理其它的关联。
下面看一下Firefox浏览器的实例:
那么这些信息是保存在那里呢?
上面看到的信息都保存在注册表中,主要位于
HKEY_CURRENT_USER\Software\Classes
HKEY_LOCAL_MACHINE\Software\Classes
为了使用方便,注册表中单独定义了HKEY_CLASS_ROOT根键,实质上里面的内容是HKCU和HKLM下的键值合并后的视图。HKCU的优先级会高于HKLM下的。
所以:读要从HKEY_CLASS_ROOT下面来读,如果写的话,最好写到HKEY_CURRENT_USER下面。
看看注册表中的键值:
在XP系统下,如果要想设置一个扩展名关联到一个程序,那就要把这个扩展名的默认值写成该App的ProgId,然后就会从该ProgId下读取Shell\open\command来执行打开操作。
在Win7系统下,多了一步,就是说如果下面有键值,则会优先从下面键值中指定的ProgId中读取:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ext\UserChoice\Progid
如果上面的Progid键值不存在,则会按xp下的规则执行。
对于http、https等协议,关联的原理基本和扩展名差不多,但是在不同系统上有区别。
在XP系统下,http等协议不会从扩展名的默认值中指定的ProgId来读取打开程序,而是直接读取http键值下的shell\open\command.
如图:
在Win7系统下,也是先从下面的键值中先读取:
HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice\Progid
注意,读取的是Progid,然后再从这个ProgId中读取shell\open\command内容。而不是
开始菜单中显示的浏览器是从下面的地方读取的:
HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\
比如Firefox显示的就是Firefox.exe.
那系统如何知道Firefox.exe是从哪里启动呢?
这个Firefox.exe是位于
HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\
HKEY_LOCAL_MACHINE\Software\Clients\StartMenuInternet\
下的键值。
在这个键值下有shell\open\command\
如图:
这个键值XP和Win7下都是一样的。
xp下设置默认浏览器需要修改的键值
改开始菜单显示的默认浏览器:
HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\@
新:字符串:"谷歌浏览器"
改.htm、.html等扩展名写入ProgId
HKEY_CURRENT_USER\Software\Classes\.htm\@
新:字符串:"ChromeHTML"
改http、https、ftp等协议
写入DefaultIcon
写入shellopencommand
HKEY_CURRENT_USER\Software\Classes\ftp\DefaultIcon\@
新:字符串:"C:\DocumentsandSettings\Administrator\LocalSettings\ApplicationData\Google\Chrome\Application\chrome.exe,0"
HKEY_CURRENT_USER\Software\Classes\ftp\shell\open\command\@
新:字符串:""C:\DocumentsandSettings\Administrator\LocalSettings\ApplicationData\Google\Chrome\Application\chrome.exe"--"%1""
Win7下需要修改的键值
改开始菜单显示的默认浏览器:
HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\@
新:字符串:"谷歌浏览器"
改.htm、.html等扩展名写入ProgId
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.htm\UserChoice\Progid
新:字符串:"ChromeHTML"
改http、https、ftp等协议
HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice\Progid
新:字符串:"ChromeHTML"
ProgrammaticIdentifiers
http://msdn.microsoft.com/en-us/library/cc144152(VS.85).aspx
MSDN(VS2008附带):
Win32andCOMDevelopment\UserInterface\WindowsUserExperience\WindowsShell\Windowsshell\ShellDeveloper’sGuide\IntegrationofApplicationsintotheShellforFileFormatOwners
工具:RegSnap
作者:linjiet#gmail.com
在Windows系统中很多浏览器中都有设置“默认浏览器”的功能,基本上家家都有。除了浏览器自身的设置外,XP、Win7中也提供了很多方法来设置。特别是Win7中,专门提供了一个叫“默认程序”的设置项。那么,这些设置背后的故事是什么呢?
什么是默认浏览器?
要研究东西,先要明确它的范围和定义。那么,什么是默认浏览器呢?我总结了下,主要有下面三块内容:因此设置默认浏览器,只需要把上面的三块内容分别搞清楚即可。
扩展名关联
在Windows系统的设计中,一个软件可以有多个扩展名。为了区分不同的软件,因此一个软件(App)就对应一个ProgId(ProgrammaticIdentifiers),而一个扩展名则与一个ProgID相关联。当然,一个App是可以有多个ProgId的,比如说一类来处理文件管理,一类来处理其它的关联。下面看一下Firefox浏览器的实例:
那么这些信息是保存在那里呢?
注册表
上面看到的信息都保存在注册表中,主要位于HKEY_CURRENT_USER\Software\Classes
HKEY_LOCAL_MACHINE\Software\Classes
为了使用方便,注册表中单独定义了HKEY_CLASS_ROOT根键,实质上里面的内容是HKCU和HKLM下的键值合并后的视图。HKCU的优先级会高于HKLM下的。
所以:读要从HKEY_CLASS_ROOT下面来读,如果写的话,最好写到HKEY_CURRENT_USER下面。
看看注册表中的键值:
在XP系统下,如果要想设置一个扩展名关联到一个程序,那就要把这个扩展名的默认值写成该App的ProgId,然后就会从该ProgId下读取Shell\open\command来执行打开操作。
在Win7系统下,多了一步,就是说如果下面有键值,则会优先从下面键值中指定的ProgId中读取:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ext\UserChoice\Progid
如果上面的Progid键值不存在,则会按xp下的规则执行。
协议关联
对于http、https等协议,关联的原理基本和扩展名差不多,但是在不同系统上有区别。在XP系统下,http等协议不会从扩展名的默认值中指定的ProgId来读取打开程序,而是直接读取http键值下的shell\open\command.
如图:
在Win7系统下,也是先从下面的键值中先读取:
HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice\Progid
注意,读取的是Progid,然后再从这个ProgId中读取shell\open\command内容。而不是
开始菜单中显示的浏览器
开始菜单中显示的浏览器是从下面的地方读取的:HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\
比如Firefox显示的就是Firefox.exe.
那系统如何知道Firefox.exe是从哪里启动呢?
这个Firefox.exe是位于
HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\
HKEY_LOCAL_MACHINE\Software\Clients\StartMenuInternet\
下的键值。
在这个键值下有shell\open\command\
如图:
这个键值XP和Win7下都是一样的。
总结
xp下设置默认浏览器需要修改的键值改开始菜单显示的默认浏览器:
HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\@
新:字符串:"谷歌浏览器"
改.htm、.html等扩展名写入ProgId
HKEY_CURRENT_USER\Software\Classes\.htm\@
新:字符串:"ChromeHTML"
改http、https、ftp等协议
写入DefaultIcon
写入shellopencommand
HKEY_CURRENT_USER\Software\Classes\ftp\DefaultIcon\@
新:字符串:"C:\DocumentsandSettings\Administrator\LocalSettings\ApplicationData\Google\Chrome\Application\chrome.exe,0"
HKEY_CURRENT_USER\Software\Classes\ftp\shell\open\command\@
新:字符串:""C:\DocumentsandSettings\Administrator\LocalSettings\ApplicationData\Google\Chrome\Application\chrome.exe"--"%1""
Win7下需要修改的键值
改开始菜单显示的默认浏览器:
HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\@
新:字符串:"谷歌浏览器"
改.htm、.html等扩展名写入ProgId
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.htm\UserChoice\Progid
新:字符串:"ChromeHTML"
改http、https、ftp等协议
HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice\Progid
新:字符串:"ChromeHTML"
参考资料
ProgrammaticIdentifiersMSDN(VS2008附带):
Win32andCOMDevelopment\UserInterface\WindowsUserExperience\WindowsShell\Windowsshell\ShellDeveloper’sGuide\IntegrationofApplicationsintotheShellforFileFormatOwners
工具:RegSnap
相关文章推荐
- C#抽象类
- Lua中的元表和元方法
- mysql5.7.11及navicat安装方法
- Java IO
- [Android教程] android的 Http工具类
- mysql简介
- POJ 1160 dp + 四边形优化
- Adobe Illustrator CS5 (AI软件) 免费精简中文版
- redis(转)
- 学习Java垃圾回收机制
- SpriteKit游戏开发 Challenge 2: An invincible zombie 问题的另一种解决方法
- SpriteKit游戏开发 Challenge 2: An invincible zombie 问题的另一种解决方法
- java对象与xml相互转换 ---- xstream
- Android布局控件之TableLayout
- C++里的继承和多态(上)
- SpriteKit游戏开发 Challenge 2: An invincible zombie 问题的另一种解决方法
- ora-01017 和oracle database link
- Spring定时任务的几种实现
- 子树
- cocos2dx的CCCamera