为了账号安全,请及时绑定邮箱和手机立即绑定

Windows 文件关联浅析

标签:
C++
引言

所谓的文件关联就是指系统把指定扩展名的文件自动关联到相应的应用程序,例如 .doc 默认打开方式是 Microsoft Word,当用户双击时就会启动 Word 打开该文件。windows 平台下的文件默认打开方式一直是各大互联网公司的必争之地,如:各种播放器抢媒体文件的默认打开方式,写这篇文章简单的总结下windows下的文件关联方式。

一 文件关联相关的注册表

Windows 用注册表来保存当前系统的所有文件关联设置,如果想更改文件关联设置,就要在注册表上做文章。首先简单介绍下注册表的各个目录引用自msdn

  • HKEY_LOCAL_MACHINE:包含关于本地计算机系统的信息,包括硬件和操作系统数据,如总线类型、系统内存、设备驱动程序和启动控制数据。
  • HKEY_CURRENT_USER:包含当前以交互方式(与远程方式相反)登录的用户的用户配置文件,包括环境变量、桌面设置、网络连接、打印机和程序首选项。该子树是 HKEY_USERS 子树的别名,它指向 HKEY_USERS当前用户的安全 ID。
  • HKEY_CLASSES_ROOT:包含用于各种 OLE 技术和文件类关联数据的信息。如果HKEY_LOCAL_MACHINE\SOFTWARE\ClassesHKEY_CURRENT_USER\SOFTWARE\Classes中存在相应的项或值,则在 HKEY_CLASSES_ROOT中会存在某个特定的项或值。如果两处均存在项或值,则 HKEY_CURRENT_USER 版本将是出现在HKEY_CLASSES_ROOT 中的那一个。
  • HKEY_USERS:包含关于动态加载的用户配置文件和默认配置文件的信息。它包含同时出现在 HKEY_CURRENT_USER中的信息。正在远程访问服务器的用户在服务器上的该项下没有配置文件;他们的配置文件将加载到自己计算机的注册表中。
  • HKEY_CURRENT_CONFIG:包含在启动时由本地计算机系统使用的硬件配置文件的相关信息。该信息用于配置一些设置,如要加载的设备驱动程序、显示时要使用的分辨率。该子树属于 HKEY_LOCAL_MACHINE 子树,它指向HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Hardware Profiles\Current

与文件关联相关的注册表项主要有以下几项:

HKEY_CURRENT_USER\Software\Classe
HKEY_LOCAL_MACHINE\Software\Classe
HKEY_CLASS_ROOT
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\

以下HKEY_LOCAL_MACHINE简称为HKLMHKEY_CURRENT_USER简称为HKCUHKEY_CLASSES_ROOT简称为HKCR
其中HKCU保存了当前用户的文件关联设置,HKLM保存了本机上所有用户的设置,HKCR是上面两个位置下的键值合并,是为了访问方便而建立的视图,...\\FileExts\\保存了右键选择“打开方式”改变默认的关联程序。

二 各项注册表的关联优先级及权限

1 关联优先级

...\\FileExts\\高于HKCU高于HKLM。(由于HKCR只是为了访问方便而建立的视图,最好只用于读取,若要更改则可以更改HKCUHKLM下对应的内容即可)

2 修改权限

vista 以上的 windows 版本在开启 UAC 的情况下,更改HKLM本机设置需要管理员权限(提权),更改HKCU当前用户设置不需要提权。

3 用户双击文件时查找顺序

首先检查...\\FileExts\\,找不到时查找HKCU,最后才是HKLM。因此检查一个文件是否与某个程序关联可以按照这个顺序检查。

三 如何关联文件

以 apk 文件为例,需要在上面所说几个位置下有 .apk 注册表项,该项的默认值对应 ProgId,例如命名为 ApkFile)。在 .apk 的相同层级下写入 ApkFile 注册表项,包含 subkey:DefaultIconshell\open\command。其中 DefaultIcon 子项的值为显示的图标,shell\open\command 的值为关联的程序。整体结构如下:

HKEY_CURRENT_USER\Software\Classes
    .apk
        (Default) = ApkFile
    ApkFile
        DefaultIcon
            (Default) = xxx
    shell
        open
            command
                (Default) = xxx.exe %1

在更改了文件关联以后,需要调用SHChangeNotify参数为SHCNE_ASSOCCHANGED通知 Windows 文件关联设置已经改变,否则要下次登录才能看到变化。

总结

文件关联实际上就是更改相应的注册表项,更改HKLM下的注册表项对计算机上所有用户都会有影响,但在开启UAC的计算机上需要提权,而且优先级不如HKCU只对当前用户起作用,且不需要提权,而且优先级高于HKLM,所以一般的桌面软件建议更改这一项,至于以什么方式更改(常驻进程定时查询,暴力抢占等等)就看产品了。...\\FileExts\\下的UserChoice是用户选择的默认关联方式,由用户指定,不建议更改。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消