On versions of Windows prior to Windows 10, I can get the default browser from the following registry key:
HKEY_CURRENT_USER\\SOFTWARE\\Clients\\StartMenuInterne
Found a solution if none of these others are working. I had an issue where window's default browser directory for chromium (portable version at chromium.woolyss.com) was at the downloads folder and windows had not detected the missing executable for the default browser, icon was missing too in w10 settings.
After trying many things I eventually got a fix, updating the directory values at
Computer\HKEY_CLASSES_ROOT\Chromium(randomstring)\shell\open\command
at "\HKEY_CLASSES_ROOT\Chromium(randomstring)\" the random letters/numbers at the end of chromium will be different for everyone im assuming so just look for chromium and you'll see it.
Technically StartMenuInternet
is not the default browser, it merely determined how the system reacted when you clicked on the Internet
icon in the start menu.
In Windows 10, the default application handling is done via the user choice key under:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Shell\Associations\URLAssociations\(http|https)\UserChoice
where (http|https)
is one of these e.g. just http
or just https
The key ProgId
references the handler application id that is invoked when the open for the url is invoked.
The ProgId value can be looked up by key in HKEY_CLASSES_ROOT
, and you're looking for the Shell/Open/command
default value. For most browsers it will be a simple reference to the executable. You should be able to use the Application
key to get the ApplicationName
, etc.
Modern applications will reference LaunchWinApp
with a DelegateExecute
value which specifies the actual application to launch (it's never easy, is it?), the ApplicationName in that case is a reference to a resource in the app (I have no idea how to read those values).
however, why are you looking for this information - if it's merely to open a web page, then you should use the Desktop API (since java 1.6) e.g.:
Desktop.getDesktop().browse(new URI("http://msn.com"));
Gross detail on how to read applications that support a specific url scheme:
On Windows, the control of the default applications is determined by the Default Programs
app, this app reads information that applications place in the registry.
There are two places the OS looks for registered applications:
HKEY_CURRENT_USER\SOFTWARE\RegisteredApplications
and
HKEY_LOCAL_MACHINE\SOFTWARE\RegisteredApplications
The entries under those keys are references to a corresponding location in the registry rooted under the same origin as the ResisteredApplications
key you're looking at.
e.g. when you install firefox, it places an entry in there labelled Firefox
, containing the value Software\Clients\StartMenuInternet\FIREFOX.EXE\Capabilities
. This is referencing HKEY_LOCAL_MACHINE\…\Capabilities
.
When you look under that location, you will see the key URLAssociations
, which specifies the URLs that it handles. When you see both http
and https
Values, it makes it very likely that this is a web browser. The name of the applications should be obtainable from the ApplicationName
value in the Capabilities
key. This key can reference localized names, or be the localized name on it's own. Determining the value from an indirection is not trivial (would be worth it's own questions).
You can backtrack from the url's value (e.g. http -> FirefoxURL) to a HKEY_CLASSES_ROOT\FirefoxURL\Shell\Open\Command
to get an executable, again remembering that new-ui applications are a special case.