Reputation: 21252
Is there a common method/api to list all web browsers (name, executable, default yes/no) installed on my machine (and per user), and how to find out which is the default web browser?
I have seen this question: How to find all the browsers installed on a machine
And on MSDN: How to Register an Internet Browser or Email Client With the Windows Start Menu which states that web-browsers should register themselves under HKLM\SOFTWARE\Clients\StartMenuInternet
(and HKCU
)
Is that really the common/correct approach? (And if yes, any solid implementation out there?)
My goal is to create a drop-down menu with a list of all web-browsers installed on user's machine (indicating the default), and allow the user to browse his HTML file/URLs with one of the external web-browser available.
Upvotes: 6
Views: 5954
Reputation: 109002
You could do something like
procedure ListRegisteredBrowsers(List: TStrings);
var
reg: TRegistry;
ki: TRegKeyInfo;
i: Integer;
keyname: string;
len: DWORD;
begin
reg := TRegistry.Create;
try
reg.RootKey := HKEY_LOCAL_MACHINE;
if not Reg.KeyExists('\SOFTWARE\Clients\StartMenuInternet') then Exit;
if not Reg.OpenKey('\SOFTWARE\Clients\StartMenuInternet', false) then
raise Exception.Create('ListRegisteredBrowsers: Could not open registry key.');
if not reg.GetKeyInfo(ki) then
raise Exception.Create('ListRegisteredBrowsers: Could not obtain registry key information.');
List.Clear;
SetLength(keyname, len);
for i := 0 to ki.NumSubKeys - 1 do
begin
len := ki.MaxSubKeyLen + 1;
if RegEnumKeyEx(reg.CurrentKey, i, PChar(keyname), len, nil, nil, nil, nil) <> ERROR_SUCCESS then
RaiseLastOSError;
if reg.OpenKey('\SOFTWARE\Clients\StartMenuInternet\' + keyname, false) then
List.Add(reg.ReadString(''));
Reg.OpenKey('\SOFTWARE\Clients\StartMenuInternet', true);
end;
finally
reg.Free;
end;
end;
and
function GetDefaultBrowser: string;
var
reg: TRegistry;
begin
result := '';
reg := TRegistry.Create;
try
reg.RootKey := HKEY_CURRENT_USER;
if Reg.OpenKey('\SOFTWARE\Clients\StartMenuInternet', false) then
result := reg.ReadString('')
else
begin
reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('\SOFTWARE\Clients\StartMenuInternet', false) then
result := reg.ReadString('')
end;
reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('\SOFTWARE\Clients\StartMenuInternet\' + result, false) then
result := reg.ReadString('');
finally
reg.Free;
end;
end;
Test it:
procedure TForm1.Button1Click(Sender: TObject);
var
sl: TStringList;
i: Integer;
DefBrw: string;
begin
DefBrw := GetDefaultBrowser;
sl := TStringList.Create;
try
ListRegisteredBrowsers(sl);
Memo1.Lines.BeginUpdate;
for i := 0 to sl.Count - 1 do
if SameText(sl[i], DefBrw) then
Memo1.Lines.Add(sl[i] + ' (Default)')
else
Memo1.Lines.Add(sl[i]);
Memo1.Lines.EndUpdate;
finally
sl.Free;
end;
end;
Upvotes: 7
Reputation: 613252
That method finds all the browsers that are registered as Start Menu Internet Applications. In practice that will suffice since all the major browsers register themselves in this way. If a browser fails to register itself as a Start Menu Internet Applications then it has no chance of Windows noticing it and offering that browser to the user.
The MSDN topic that explains it all is here: http://msdn.microsoft.com/en-us/library/windows/desktop/dd203067.aspx
The Start menu in Windows XP and Windows Vista contains reserved slots for the default Internet (browser) and E-mail (mail) clients, together commonly known as Start Menu Internet Applications. Applications which register as Start Menu Internet Applications do so across the entire system (per-machine). In Windows Vista, the user may use the Default Programs feature to set a per-user default.
Upvotes: 6