1. 项目概述:获取电脑已安装的浏览器列表
在Windows系统开发中,我们经常需要获取用户电脑上安装的浏览器信息。这个需求常见于需要调用默认浏览器打开网页、检测浏览器兼容性或者开发浏览器管理工具等场景。通过Windows注册表,我们可以准确获取系统已安装的浏览器列表,而不会包含那些绿色版或便携版的浏览器。
传统方法是通过遍历Program Files目录或检查文件关联来获取浏览器信息,但这些方法要么不够准确,要么会包含非正常安装的浏览器。注册表中的HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet路径专门用于存储通过标准安装程序安装的浏览器信息,是获取浏览器列表最可靠的方式。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术原理与注册表结构解析
2.1 Windows注册表中的浏览器信息存储
Windows系统通过注册表来管理系统安装的各种应用程序信息,浏览器作为一种特殊类型的应用程序,在注册表中有专门的存储位置。HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet这个键值下存储了所有通过标准安装程序安装的浏览器信息。
这个注册表项的设计初衷是为了让Windows能够管理"默认浏览器"的设置。当用户在系统设置中选择默认浏览器时,系统实际上就是在修改这个注册表项下的相关值。
2.2 注册表键值结构详解
在这个注册表路径下,每个子键代表一个已安装的浏览器。以Chrome浏览器为例,其注册表结构通常如下:
code复制HKEY_LOCAL_MACHINE
\SOFTWARE
\Clients
\StartMenuInternet
\Google Chrome
\shell
\open
\command
(Default) = "C:\Program Files\Google\Chrome\Application\chrome.exe" -- "%1"
每个浏览器子键下通常包含以下重要信息:
- 默认值:浏览器的显示名称
- shell\open\command:浏览器可执行文件的完整路径及启动参数
- Capabilities:浏览器的功能描述(如支持的协议、文件类型等)
3. Qt实现方案与代码解析
3.1 使用QSettings访问Windows注册表
Qt提供了QSettings类来方便地访问平台特定的设置,包括Windows注册表。我们可以使用它来读取浏览器信息:
cpp复制QString regPath = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Clients\\StartMenuInternet";
QSettings settings(regPath, QSettings::NativeFormat);
QStringList browserKeys = settings.childGroups();
这段代码首先指定了要访问的注册表路径,然后创建QSettings对象。childGroups()方法返回该路径下所有的子键名称,也就是各个浏览器的标识符。
3.2 路径清理与正则表达式处理
从注册表获取的浏览器路径通常包含引号和启动参数,我们需要提取出纯净的可执行文件路径。代码中使用了正则表达式来处理这种情况:
cpp复制QString regPin = R"xxx("([^"]+\.exe)"|(?<!\S)([\w:/\\ -]+\.exe))xxx";
QRegularExpression reg(regPin, QRegularExpression::CaseInsensitiveOption);
这个正则表达式可以匹配两种格式的路径:
- 被双引号包围的路径(如
"C:\Program Files\Chrome\chrome.exe") - 没有被引号包围但以.exe结尾的路径(如
C:\Program Files\Edge\msedge.exe)
3.3 完整获取浏览器列表的实现
下面是完整的获取浏览器列表的函数实现:
cpp复制QMap<QString, QString> getBrowsersFromStartMenuInternet() {
QMap<QString, QString> browserMap;
QString regPath = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Clients\\Star
