List all web-browsers installed on a Windows machine

前端 未结 2 1693
傲寒
傲寒 2021-02-10 00:46

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 t

相关标签:
2条回答
  • 2021-02-10 01:12

    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.

    0 讨论(0)
  • 2021-02-10 01:27

    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;
    
    0 讨论(0)
提交回复
热议问题