在Windows 10之前的Windows版本中,我可以从以下注册表项获取默认浏览器:
HKEY_CURRENT_USER\SOFTWARE\Clients\StartMenuInternet
在Windows 10上,我将Microsoft Edge设置为默认浏览器。但我在上面的注册表项中没有看到任何更改。
但是,在以前版本的Windows上,它可以正常工作。
如何获取Windows 10上的默认浏览器?
发布于 2015-09-02 22:07:55
从技术上讲,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
(从Java1.6开始),例如:
Desktop.getDesktop().browse(new URI("http://msn.com"));
有关如何读取支持特定url方案(https://msdn.microsoft.com/en-us/library/windows/desktop/cc144154(v=vs.85%29.aspx))的应用程序的详细信息
在Windows上,默认应用程序的控制由Default Programs
应用程序决定,该应用程序读取应用程序放置在注册表中的信息。
操作系统在两个地方查找已注册的应用程序:
HKEY_CURRENT_USER\SOFTWARE\RegisteredApplications
和
HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications
这些注册表项下的条目是对注册表中相应位置的引用,该位置与您正在查看的ResisteredApplications
注册表项的根位置相同。
例如,当你安装火狐时,它会在其中放置一个标签为Firefox
的条目,其中包含值Software\Clients\StartMenuInternet\FIREFOX.EXE\Capabilities
。这是引用HKEY_LOCAL_MACHINE\…\Capabilities
。
当您查看该位置下时,您将看到键URLAssociations
,它指定了它所处理的URL。如果同时看到http
和https
值,则很可能是web浏览器。应用程序的名称应该可以从Capabilities
密钥中的ApplicationName
值获得。此键可以引用本地化名称,也可以是其自身的本地化名称。从间接路径确定价值并不是一件微不足道的事情(值得我们自己去问)。
您可以从url的值(例如,http -> FirefoxURL)回溯到HKEY_CLASSES_ROOT\FirefoxURL\Shell\Open\Command
以获得可执行文件,请再次记住,新ui应用程序是一个特例。
发布于 2020-05-15 15:49:50
如果这些都不起作用,我找到了一个解决方案。我遇到了一个问题,windows默认的铬浏览器目录(chromium.woolyss.com的便携版本)位于downloads文件夹,windows没有检测到缺省浏览器缺少的可执行文件,w10设置中也缺少图标。
在尝试了许多方法之后,我最终得到了一个修复方法,即更新目录值
Computer\HKEY_CLASSES_ROOT\Chromium(randomstring)\shell\open\command
在“\HKEY_CLASSES_ROOT\Chromium(随机字符串)\”中,铬的末尾的随机字母/数字对于每个人都是不同的,所以我假设只要查找铬,你就会看到它。
发布于 2021-11-20 23:06:10
这里的每个人都在探索未记录的注册表。You should not be doing that.
相反,您应该使用预期的、受支持的API函数:
从概念上讲,调用是:
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;
}
奖金闲聊
SM_AccessoriesName
registry valuehttps://stackoverflow.com/questions/32354861
复制相似问题