zoukankan      html  css  js  c++  java
  • Windows沙拉:默认浏览器背后的故事(转载)

    思路清晰、分析透彻的好文章,收录备用。本文原作者:Greenerycn  ,原文来源:http://greenerycn.cnblogs.com

    在Windows系统中很多浏览器中都有设置“默认浏览器”的功能,基本上家家都有。除了浏览器自身的设置外,XP、Win7中也提供了很多方法来设置。特别是Win7中,专门提供了一个叫“默认程序”的设置项。那么,这些设置背后的故事是什么呢?

    什么是默认浏览器?

    要研究东西,先要明确它的范围和定义。那么,什么是默认浏览器呢?我总结了下,主要有下面三块内容:

     因此设置默认浏览器,只需要把上面的三块内容分别搞清楚即可。

     扩展名关联

    在 Windows系统的设计中,一个软件可以有多个扩展名。为了区分不同的软件,因此一个软件(App)就对应一个ProgId(Programmatic Identifiers),而一个扩展名则与一个ProgID相关联。当然,一个App是可以有多个ProgId的,比如说一类来处理文件管理,一类来处 理其它的关联。

    下面看一下Firefox浏览器的实例:

    那么这些信息是保存在那里呢?

    注册表

    上面看到的信息都保存在注册表中,主要位于

    HKEY_CURRENT_USERSoftwareClasses

    HKEY_LOCAL_MACHINESoftwareClasses

    为了使用方便,注册表中单独定义了HKEY_CLASS_ROOT根键,实质上里面的内容是HKCU和HKLM下的键值合并后的视图。HKCU的优先级会高于HKLM下的。

    所以:读要从HKEY_CLASS_ROOT下面来读, 如果写的话,最好写到HKEY_CURRENT_USER下面。

    看看注册表中的键值:

    在XP系统下,如果要想设置一个扩展名关联到一个程序,那就要把这个扩展名的默认值写成该App的ProgId,然后就会从该ProgId下读取Shellopencommand来执行打开操作。

    在Win7系统下,多了一步,就是说如果下面有键值,则会优先从下面键值中指定的ProgId中读取:

    HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerFileExts.extUserChoiceProgid

    如果上面的Progid键值不存在,则会按xp下的规则执行。

    协议关联

    对于http、https等协议,关联的原理基本和扩展名差不多,但是在不同系统上有区别。

    在XP系统下, http等协议不会从扩展名的默认值中指定的ProgId来读取打开程序,而是直接读取http键值下的shellopencommand.

    如图:

    在Win7系统下,也是先从下面的键值中先读取:

    HKEY_CURRENT_USERSoftwareMicrosoftWindowsShellAssociationsUrlAssociationshttpUserChoiceProgid

    注意,读取的是Progid,然后再从这个ProgId中读取shellopencommand内容。而不是

    开始菜单中显示的浏览器

    开始菜单中显示的浏览器是从下面的地方读取的:

    HKEY_CURRENT_USERSoftwareClientsStartMenuInternet

    比如Firefox显示的就是Firefox.exe.

    那系统如何知道Firefox.exe是从哪里启动呢?

    这个Firefox.exe是位于

    HKEY_CURRENT_USERSoftwareClientsStartMenuInternet

    HKEY_LOCAL_MACHINESoftwareClientsStartMenuInternet

    下的键值。

    在这个键值下有shellopencommand

    如图:

    这个键值XP和Win7下都是一样的。

    总结

    xp下设置默认浏览器需要修改的键值

    改开始菜单显示的默认浏览器:

    HKEY_CURRENT_USERSoftwareClientsStartMenuInternet@
    新: 字符串: "谷歌浏览器"

    改.htm、.html等扩展名   写入ProgId
    HKEY_CURRENT_USERSoftwareClasses.htm@
    新: 字符串: "ChromeHTML"

    改http、https、ftp等协议

    写入DefaultIcon
    写入shell open command

    HKEY_CURRENT_USERSoftwareClassesftpDefaultIcon@
    新: 字符串: "C:Documents and SettingsAdministratorLocal SettingsApplication DataGoogleChromeApplicationchrome.exe,0"

    HKEY_CURRENT_USERSoftwareClassesftpshellopencommand@
    新: 字符串: ""C:Documents and SettingsAdministratorLocal SettingsApplication DataGoogleChromeApplicationchrome.exe" -- "%1""

    Win7下需要修改的键值

    改开始菜单显示的默认浏览器:

    HKEY_CURRENT_USERSoftwareClientsStartMenuInternet@
    新: 字符串: "谷歌浏览器"

    改.htm、.html等扩展名   写入ProgId

    HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerFileExts.htmUserChoiceProgid
    新: 字符串: "ChromeHTML"

    改http、https、ftp等协议

    HKEY_CURRENT_USERSoftwareMicrosoftWindowsShellAssociationsUrlAssociationshttpUserChoiceProgid
    新: 字符串: "ChromeHTML"

     参考资料

    Programmatic Identifiers

    http://msdn.microsoft.com/en-us/library/cc144152(VS.85).aspx

    MSDN(VS2008附带):

    Win32 and COM DevelopmentUser InterfaceWindows User ExperienceWindows ShellWindows shellShell Developer’s GuideIntegration of Applications into the Shell for File Format Owners

    工具:RegSnap

  • 相关阅读:
    leetcode Super Ugly Number
    leetcode Find Median from Data Stream
    leetcode Remove Invalid Parentheses
    leetcode Range Sum Query
    leetcode Range Sum Query
    leetcode Minimum Height Trees
    hdu 3836 Equivalent Sets
    hdu 1269 迷宫城堡
    hud 2586 How far away ?
    poj 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/sj2860/p/3154558.html
Copyright © 2011-2022 走看看