列出Windows计算机上安装的所有web浏览器

本文关键字:web 浏览器 安装 Windows 计算机 列出 | 更新日期: 2023-09-27 18:28:53

是否有通用方法/api来列出我的机器上安装的所有web浏览器(名称、可执行文件、默认是/否)(以及每个用户),以及如何找出哪个是默认的web浏览器?

我看到了这个问题:如何找到安装在机器上的所有浏览器

在MSDN上:如何使用Windows开始菜单注册Internet浏览器或电子邮件客户端,该菜单规定web浏览器HKLM'SOFTWARE'Clients'StartMenuInternet(和HKCU)下注册

这真的是常用/正确的方法吗?(如果是的话,有什么可靠的实现吗?)


我的目标是创建一个下拉菜单,其中包含安装在用户机器上的所有web浏览器的列表(表示默认值),并允许用户使用一个可用的外部web浏览器浏览他的HTML文件/URL。

列出Windows计算机上安装的所有web浏览器

你可以做一些类似的事情

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;

该方法查找所有注册为开始菜单Internet应用程序的浏览器。在实践中,这就足够了,因为所有主要的浏览器都是以这种方式注册的。如果浏览器未能注册为「开始」菜单Internet应用程序,则Windows不会注意到它并向用户提供该浏览器。

MSDN主题在这里解释了这一切:http://msdn.microsoft.com/en-us/library/windows/desktop/dd203067.aspx

Windows XP和Windows Vista中的「开始」菜单包含默认Internet(浏览器)和电子邮件(邮件)客户端的保留插槽,通常称为「开始」功能表Internet应用程序。注册为「开始」菜单的应用程序Internet应用程序在整个系统中都会注册(每台机器)。在Windows Vista中,用户可以使用"默认程序"功能设置每个用户的默认值。