c# - 列出 Windows 机器上安装的所有网络浏览器

标签 c# c++ delphi winapi browser

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

我看过这个问题: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可用。

最佳答案

你可以做类似的事情

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;

关于c# - 列出 Windows 机器上安装的所有网络浏览器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9841515/

相关文章:

c# - 如何管理 Web 应用程序中的自定义字体 (system.drawing)

c# - 常量字符串声明/初始化断点

c++ - 具有在 C++ 中需要参数的构造函数的新对象数组

c++ - "virtual"关键字在 C++ 的基类中是可选的吗?

delphi - 在 Windows 注册表中隐藏 key 的最佳位置?

c# 向项目添加新的命名空间

c# - 如何在不使用指针的情况下模拟指针?

c# - 依赖于 Visual C++ 2013 运行时的 NuGet 包

delphi - 如何禁用delphi中的某些键

delphi - SynEdit 不会安装在 Delphi 10.1 Berlin Starter Update 1 中