2012-03-23 2 views
5

Есть ли общий метод/api для отображения всех веб-браузеров (имя, исполняемый, по умолчанию да/нет), установленных на моей машине (и на каждого пользователя), а также узнать, который является веб-браузером по умолчанию?Список всех веб-браузеров, установленных на компьютере с Windows

Я видел этот вопрос: 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\StartMenuInternetHKCU)

Это действительно общий/правильный подход? (И если да, то любое твердое осуществление там?)


Моя цель состоит в том, чтобы создать выпадающее меню со списком всех веб-браузеров, установленных на компьютере пользователя (с указанием по умолчанию), и позволяют чтобы просмотреть его HTML-файл/URL-адреса с одним из доступных внешних веб-браузеров.

+1

Вы, вероятно, может получить браузер по умолчанию, основываясь на то, что все настроено, чтобы справиться .url-файлы и URL-адреса http/https, но в окнах нет ничего, что скажет: «Это приложение является браузер "или" это приложение включает браузер " –

+0

@David, я ищу надежный ответ от программистов (которые могли бы также * реализовать * выше). пожалуйста, оставьте теги как есть. – kobik

+0

Ну, я не понимаю, что вопрос имеет отношение к конкретным языкам программирования. Вы имеете в виду, что вы не хотите слышать от информированного программиста на C#? –

ответ

6

Вы могли бы сделать что-то вроде

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; 
+0

Спасибо. Я пока не могу проверить код. но я вижу, что в 'ListRegisteredBrowsers' нет' HKCU', а в 'GetDefaultBrowser' вы отдаете приоритет' HKCU'. любая причина для этого решения? – kobik

+1

Я понимаю, что список установленных браузеров найден только в HKLM. В HKLM и HKCU вы можете найти браузер по умолчанию, хотя (конечно же, это настройка для каждого пользователя). –

+0

Ваш код был действительно полезен и дал мне хорошую отправную точку. Большое спасибо :) – kobik

6

Этот метод находит все браузеры, зарегистрированные как Меню «Пуск» Интернет-приложения. На практике этого будет достаточно, поскольку все основные браузеры регистрируются таким образом. Если браузер не зарегистрировался как Меню «Пуск» Интернет-приложения, тогда у него нет никаких шансов, что Windows заметит его и предложит браузер для пользователя.

MSDN от темы, которая объясняет все это здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/dd203067.aspx

меню Пуск в Windows XP и Windows Vista содержит зарезервированные слоты для Интернета по умолчанию (браузер) и электронная почта (почта) клиентов, вместе широко известный как Интернет-приложения «Пуск». Приложения, которые регистрируются в качестве меню «Пуск» Интернет-приложения, делают это во всей системе (для каждой машины). В Windows Vista пользователь может использовать функцию «Программы по умолчанию» для установки по умолчанию для каждого пользователя.

+0

Спасибо за ответ. Я включил эту тему MSDN в свой первоначальный вопрос, и это выглядит довольно надежным способом. Вы реализовали это на практике? – kobik

+3

@kobik Нет, но все мои браузеры перечислены в реестре точно так, как описано. После массового судебного процесса в ЕС я считаю, что можно с уверенностью сказать, что все основные браузеры, и, возможно, большинство не-основных браузеров будут там зарегистрироваться. –

Смежные вопросы