如何通过 Windows 10 上的注册表找到默认浏览器

Posted

技术标签:

【中文标题】如何通过 Windows 10 上的注册表找到默认浏览器【英文标题】:How to find the default browser via the registry on Windows 10 【发布时间】:2015-11-28 01:29:59 【问题描述】:

在 Windows 10 之前的 Windows 版本上,我可以从以下注册表项获取默认浏览器:

HKEY_CURRENT_USER\SOFTWARE\Clients\StartMenuInternet

在 Windows 10 上,我将 Microsoft Edge 设置为默认浏览器。但我没有看到上面的注册表项有任何变化。

但是,在以前版本的 Windows 上,它可以正常工作。

如何在 Windows 10 上获取默认浏览器?

【问题讨论】:

在 Windows 上摆弄注册表总是最糟糕的事情——而且几乎总是完全没有必要。就像已经提到的那样,Desktop API 是一个不错的选择,但一定要评估isDesktopSupported @specialist:谢谢,我想通过安装在我计算机上的特定浏览器启动 url。我研究但我没有看到 API 支持通过 java 代码检测浏览器... 因为它不可能,无论使用什么语言。 【参考方案1】:

从技术上讲,StartMenuInternet 不是默认浏览器,它只是确定了当您单击开始菜单中的 Internet 图标时系统的反应。

在 Windows 10 中,默认应用程序处理是通过以下用户选择键完成的:

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Shell\Associations\URLAssociations\(http|https)\UserChoice

(http|https) 是其中之一,例如只是http 或只是https

ProgId 引用了在调用打开 URL 时调用的处理程序应用程序 ID。

可以通过HKEY_CLASSES_ROOT 中的键查找ProgId 值,您正在寻找Shell/Open/command 默认值。对于大多数浏览器来说,它只是对可执行文件的简单引用。您应该可以使用Application 键来获取ApplicationName 等。

现代应用程序将使用DelegateExecute 值引用LaunchWinApp,该值指定要启动的实际应用程序(这从来都不容易,是吗?),在这种情况下,ApplicationName 是对应用程序中资源的引用(我有不知道如何读取这些值)。

但是,为什么您要查找此信息 - 如果只是为了打开网页,那么您应该使用 Desktop API(自 java 1.6 起),例如:

Desktop.getDesktop().browse(new URI("http://msn.com"));

Gross detail on how to read applications that support a specific url scheme:

在 Windows 上,默认应用程序的控制由 Default Programs 应用程序决定,该应用程序读取应用程序放置在注册表中的信息。

操作系统在两个地方寻找已注册的应用程序:

HKEY_CURRENT_USER\SOFTWARE\RegisteredApplications

HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications

这些键下的条目引用到注册表中的相应位置,该位置与您正在查看的 ResisteredApplications 键的来源相同。

例如当您安装 Firefox 时,它会在其中放置一个标记为 Firefox 的条目,其中包含值 Software\Clients\StartMenuInternet\FIREFOX.EXE\Capabilities。这是引用HKEY_LOCAL_MACHINE\…\Capabilities

当您查看该位置时,您将看到键 URLAssociations,它指定了它处理的 URL。当您同时看到 httphttps 值时,很可能这是一个 Web 浏览器。应用程序的名称应该可以从Capabilities 键中的ApplicationName 值获得。该键可以引用本地化名称,或者是它自己的本地化名称。从间接中确定值并非易事(值得自己提出问题)。

您可以从 url 的值(例如 http -> FirefoxURL)回溯到 HKEY_CLASSES_ROOT\FirefoxURL\Shell\Open\Command 以获取可执行文件,再次记住 new-ui 应用程序是一种特殊情况。

【讨论】:

我想列出我电脑上安装的所有浏览器,所以我认为注册表窗口可以帮助我.. 你有其他方法可以检测所有浏览器吗??? 不可能“检测所有浏览器”,因为没有这样的注册 API - 一个协议只能注册一个 HANDLER,仅此而已。 Windows 不是 android,如果您想找到某些应用程序,您需要显式搜索它们 - 通过启发式路径模式和可能的目录内容......但这将非常不可靠 - 即使搜索特定于供应商的注册表设置也是非常不可靠的。 .. 最好完全忘记你的任务,因为它永远不会 100% 有效。 @specialist:默认浏览器怎么样?我们可以从注册表或其他方式检测/获取名称默认浏览器?? 没有默认浏览器,只有httphttps等协议的默认处理程序。理论上,您可以为不安全的网络浏览和“安全”的网络浏览使用单独的浏览器;但通常默认的http 处理程序可能是网络浏览器。 @Petesh:非常感谢......我认为 HKEY_CLASSES_ROOT\http\shell\open\command 可以帮助我。但我不确定它是否 100% 运作良好..=))【参考方案2】:

如果这些其他方法都不起作用,则找到解决方案。 我遇到了一个问题,其中窗口的铬默认浏览器目录(chromium.woolyss.com 上的便携式版本)位于下载文件夹中,并且 windows 没有检测到默认浏览器缺少的可执行文件,w10 设置中的图标也丢失了。

在尝试了很多事情之后,我最终得到了修复,更新了目录值

Computer\HKEY_CLASSES_ROOT\Chromium(randomstring)\shell\open\command

在“\HKEY_CLASSES_ROOT\Chromium(randomstring)\”处,铬末尾的随机字母/数字对于我假设的每个人来说都是不同的,所以只要寻找铬,你就会看到它。

【讨论】:

非常感谢。几个月来,我一直在寻找这个问题的答案。【参考方案3】:

这里的每个人都在探索未记录的注册表。 You should not be doing that.

您应该使用预期的、受支持的 API 函数:AssocQueryString

从概念上讲,调用是:

AssocQueryString(0, ASSOCSTR_EXECUTABLE, ".html", path, sizeof(path));

在我的机器上返回:

C:\Program Files (x86)\Google\Chrome\Application\chrome.exe

示例代码(伪代码)

String GetDefaultBrowser()

   String path;
   DWORD nChars = 1024;

   //Allocate enough space to hold nChars
   SetLength(path, nChars);

   HRESULT hr = AssocQueryString(ASSOCF_NONE, ASSOCSTR_EXECUTABLE, ".html", null, path), ref nChars);
   if (hr == E_POINTER)
   
      //Buffer was too small; try again with larger size
      SetLength(path, nChars);
      hr = AssocQueryString(ASSOCF_NONE, ASSOCSTR_EXECUTABLE, ".html", null, path), ref nChars);
   
   if (Failed(hr)) throw new COMException(hr);

   //Set the string buffer to size
   SetLength(path, nChars-1); // don't include the null terminator

   return path;

奖金聊天

Why not just block the apps that rely on undocumented behavior? If what you’re doing is undocumented, it’s not guaranteed to keep working, and your promise not to complain doesn’t really hold water Why did Windows NT decline to support an undocumented flag to TrackPopupMenuEx? More undocumented behavior and the people who rely on it: Output buffers The sad but short story of the SM_AccessoriesName registry value

【讨论】:

以上是关于如何通过 Windows 10 上的注册表找到默认浏览器的主要内容,如果未能解决你的问题,请参考以下文章

windows10如何恢复.bin文件的默认打开方式?

如何更改电脑储存路径

Windows如何卸载干净mysql

Windows如何卸载干净mysql

Windows ❀ Win10如何打开注册表编辑器

Windows ❀ Win10如何打开注册表编辑器