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

  • 相关阅读:
    洛谷P1328 生活大爆炸版石头剪刀布
    洛谷P1131 [ZJOI2007]时态同步
    洛谷P2585 [ZJOI2006]三色二叉树
    机器学习实战四(Logistic Regression)
    机器学习实战三(Naive Bayes)
    机器学习实战二 (Decision Tree)
    机器学习实战一(kNN)
    chapter9 拖放
    Stanford Algorithms(一): 大数相乘(c++版)
    读: 程序员之禅
  • 原文地址:https://www.cnblogs.com/sj2860/p/3154558.html
Copyright © 2011-2022 走看看