[英]List all web-browsers installed on a Windows machine
是否有一個常用的方法/ api列出我的機器(和每個用戶)上安裝的所有Web瀏覽器(名稱,可執行文件,默認是/否),以及如何找出哪個是默認的Web瀏覽器?
我看到了這個問題: 如何找到機器上安裝的所有瀏覽器
在MSDN上: 如何使用Windows開始菜單注冊Internet瀏覽器或電子郵件客戶端,該菜單指出Web瀏覽器應在HKLM\\SOFTWARE\\Clients\\StartMenuInternet
(和HKCU
)下注冊
這真的是常見/正確的方法嗎? (如果是的話,那里有任何可靠的實施嗎?)
我的目標是創建一個下拉菜單,其中列出了安裝在用戶計算機上的所有Web瀏覽器(指示默認值),並允許用戶使用其中一個外部Web瀏覽器瀏覽其HTML文件/ URL。
該方法查找所有注冊為“ 開始”菜單“Internet應用程序”的瀏覽器。 在實踐中,只要所有主流瀏覽器都以這種方式注冊自己就足夠了。 如果瀏覽器無法將自己注冊為“ 開始”菜單“Internet應用程序”,則Windows無法將其注意到並向用戶提供該瀏覽器。
解釋它的MSDN主題在這里: http : //msdn.microsoft.com/en-us/library/windows/desktop/dd203067.aspx
Windows XP和Windows Vista中的“開始”菜單包含默認Internet(瀏覽器)和電子郵件(郵件)客戶端的保留插槽,通常稱為“開始”菜單“Internet應用程序”。 注冊為“開始”菜單“Internet應用程序”的應用程序在整個系統(每台計算機)中執行此操作。 在Windows Vista中,用戶可以使用“默認程序”功能設置每個用戶的默認值。
你可以做點什么
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.