获取默认浏览器

问题描述 投票:0回答:6

如何以编程方式确定系统中的默认浏览器。代码必须使用vc++开发 有这方面的API吗?

默认浏览器值存储在注册表的哪个位置?

visual-studio winapi visual-c++ browser mfc
6个回答
12
投票

TL;DR:如果

HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\
存在,请阅读;否则请阅读
HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\

阅读此处的答案后,我发现对于如何检测默认浏览器几乎没有达成共识,因此我做了一些实验和研究来弄清楚。我下载了 Firefox 源代码,编写了一个读取大量注册表项的脚本,并在一遍又一遍地更改默认浏览器的同时运行 Process Explorer。

我发现当 Firefox 和 Chrome 将自己设置为默认浏览器时,会更改很多注册表项。我相信 Safari 和 Opera 在行为上都很相似。 IE 似乎只更改了我正在查看的注册表项之一。

我发现,虽然大多数浏览器会更改其他注册表路径,但所有浏览器都会更改

HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\
(default)

以下是注册表项的注册表值

HKEY_CURRENT_USER\Software\Clients\StartMenuInternet\
(default)
,而每个浏览器都是默认浏览器。

  • IE 9.0.8112.16421:
    IEXPLORE.EXE
  • 铬21.0.1180.60 m:
    Google Chrome
  • 火狐 10.0.2:
    FIREFOX.EXE
  • Safari 3.2.2:
    Safari.exe
  • 歌剧 12.01:
    Opera

在 Microsoft Windows 7 Home Premium SP1 64 位上测试

编辑:

我发现全新安装的 Windows XP SP3

HKEY_CURRENT_USER\SOFTWARE\Clients\StartMenuInternet\
不存在。在这种情况下,您应该从
HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\
读取默认浏览器。我怀疑全新安装其他版本的 Windows 时也会出现这种情况。

附录:

如果您只想在默认浏览器中打开网页,则

ShellExecute
方法是一个很好的解决方案。但是,例如,如果您只想在默认浏览器中安装扩展程序,
ShellExecute
并不能解决问题。


11
投票

您通常不需要知道这一点。

ShellExecute(0,0,"http://stackoverflow.com",0,0,SW_SHOWNORMAL);
就可以了。 Windows 会发现 http:// 并从中判断出您要打开的 URL。 “默认”Web 浏览器几乎被定义为 Windows 用于此任务的 Web 浏览器。

不仅仅支持http://。 ShellExecute 也可以使用 https:// URL 启动默认的 Web 浏览器。对于 mailto: URL,它会启动默认的邮件客户端。


9
投票

您可以在注册表中找到默认浏览器

即对于 Windows XP 和 Vista,位于

HKEY_LOCAL_MACHINE\Software\Clients\StartMenuInternet\

4
投票

顾名思义,

StartMenuInternet
用于将Web浏览器注册到开始菜单(仅适用于XP和Vista,从Windows 7开始已弃用)。这并不一定将该浏览器确立为整个系统的默认浏览器。可以通过多种不同的方式注册浏览器以用于不同的目的(加载文件、加载 URL、加载基于 MIME 类型的数据等)。每个注册都是单独的。

默认程序

如何使用 Windows 开始菜单注册 Internet 浏览器或电子邮件客户端

将应用程序注册到 URL 协议

文件类型

就个人而言,我可能会查看“http”和/或“https”URL 处理程序的注册来确定默认浏览器,因为当用户在“开始”菜单或 Windows 资源管理器中键入 URL 时,将加载该应用程序,或者应用程序将 URL 传递给

ShellExecute/Ex()


1
投票

读取

HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet
的默认值,并可选择检查
HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet\XXX\shell\open\command
,其中 XXX 是从第一个键获取的值。


0
投票

如果您使用

AssocQueryString
,则无需读取注册表。

WCHAR szPath[MAX_PATH];
DWORD size = _countof(szPath);

HRESULT err = AssocQueryString(
    0,
    ASSOCSTR_EXECUTABLE,
    L"http",
    NULL,
    szPath,
    &size
);
if (err != S_OK) {
    return; // Handle error
}

// szPath == "C:\Program Files\Mozilla Firefox\firefox.exe"
© www.soinside.com 2019 - 2024. All rights reserved.