【问题标题】:List all web-browsers installed on a Windows machine列出安装在 Windows 机器上的所有 Web 浏览器
【发布时间】:2012-04-08 03:35:34
【问题描述】:

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

我看过这个问题:How to find all the browsers installed on a machine

在 MSDN 上:How to Register an Internet Browser or Email Client With the Windows Start Menu 声明网络浏览器应该HKLM\SOFTWARE\Clients\StartMenuInternet(和HKCU)下注册自己

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


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

【问题讨论】:

  • 您可能会获得默认浏览器,基于处理 .url 文件和 http/https url 的设置,但 Windows 中没有任何内容会显示“此应用程序是浏览器”或“这个应用程序嵌入了一个浏览器”
  • @David,我正在寻找程序员(他们可能也实现上述内容)的可靠答案。请保持原样。
  • 好吧,我看不出这个问题与特定的编程语言有什么关系。您的意思是您不想听到消息灵通的 C# 程序员的消息吗?
  • @kobik 事情是Delphi 不是主流,我认为你可能会拒绝潜在的优秀回答者,他们会逃避任何说Delphi 的东西。无论如何,这只是我的意见,我也尊重你的意见。

标签: c# c++ delphi winapi browser


【解决方案1】:

你可以做类似的事情

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;

【讨论】:

  • 谢谢。我还不能测试代码。但是我看到ListRegisteredBrowsers中没有HKCU,而GetDefaultBrowser中你优先考虑HKCU。这个决定有什么理由吗?
  • 我的理解是安装的浏览器列表只能在HKLM中找到。不过,在 HKLM 和 HKCU 中,您都可以找到默认浏览器(当然——这是每个用户的设置)。
  • 你的代码真的很有帮助,给了我一个很好的起点。非常感谢:)
【解决方案2】:

该方法查找所有注册为开始菜单 Internet 应用程序的浏览器。实际上,这已经足够了,因为所有主要浏览器都以这种方式注册自己。如果浏览器未能将自己注册为开始菜单 Internet 应用程序,那么它就没有机会让 Windows 注意到它并将该浏览器提供给用户。

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

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

【讨论】:

  • 感谢您的回答。我在最初的问题中包含了那个 MSDN 主题,它看起来确实是一种可靠的方式。您在实践中实施了吗?
  • @kobik 不,但我所有的浏览器都完全按照描述列在注册表中。在欧盟大规模诉讼之后,我认为可以肯定地说所有主流浏览器,可能大多数非主流浏览器都会在那里注册。
猜你喜欢
  • 2010-09-21
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
相关资源
最近更新 更多