[英]List all web-browsers installed on a Windows machine
是否有一个常用的方法/ api列出我的机器(和每个用户)上安装的所有Web浏览器(名称,可执行文件,默认是/否),以及如何找出哪个是默认的Web浏览器?
我看到了这个问题: 如何找到机器上安装的所有浏览器
在MSDN上: 如何使用Windows开始菜单注册Internet浏览器或电子邮件客户端,该菜单指出Web浏览器应在HKLM\\SOFTWARE\\Clients\\StartMenuInternet
(和HKCU
)下注册
这真的是常见/正确的方法吗? (如果是的话,那里有任何可靠的实施吗?)
我的目标是创建一个下拉菜单,其中列出了安装在用户计算机上的所有Web浏览器(指示默认值),并允许用户使用其中一个外部Web浏览器浏览其HTML文件/ URL。
该方法查找所有注册为“ 开始”菜单“Internet应用程序”的浏览器。 在实践中,只要所有主流浏览器都以这种方式注册自己就足够了。 如果浏览器无法将自己注册为“ 开始”菜单“Internet应用程序”,则Windows无法将其注意到并向用户提供该浏览器。
解释它的MSDN主题在这里: http : //msdn.microsoft.com/en-us/library/windows/desktop/dd203067.aspx
Windows XP和Windows Vista中的“开始”菜单包含默认Internet(浏览器)和电子邮件(邮件)客户端的保留插槽,通常称为“开始”菜单“Internet应用程序”。 注册为“开始”菜单“Internet应用程序”的应用程序在整个系统(每台计算机)中执行此操作。 在Windows Vista中,用户可以使用“默认程序”功能设置每个用户的默认值。
你可以做点什么
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;
和
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;
测试一下:
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.