Как вывести фронтальный или запустить браузер в Delphi
Мне нужно либо вывести переднее окно браузера, если оно уже запущено, либо запустить браузер из моего приложения. Сейчас я использую ShellExecute, чтобы открыть новый браузер, но в конечном итоге он создаст много экземпляров или вкладок браузера. Так как проверить, запущен ли браузер, и переключить приложение на браузер?
Я в настоящее время использую это:
ShellExecute(Handle, 'open', URL, nil, nil, SW_SHOWNORMAL);
3 ответа
То, как вы это делаете, это способ открыть браузер по умолчанию. Проблема заключается в том, что IE и Firefox всегда будут открывать документ вместо того, чтобы вывести соответствующую вкладку вперед.
Я подумал, что вы могли бы делать что-то для браузера с помощью переключателей командной строки. В этом случае вы должны получить браузер по умолчанию с помощью команды HKEY_CLASSES_ROOT\HTTP\shell\open\.
К сожалению, ни один из двух основных браузеров не имеет переключателя, чтобы открывать только URL, который еще не открыт. (IE переключается здесь, Firefox переключается здесь). Кроме того, в дни просмотра без вкладок я бы посоветовал вам взглянуть на EnumWindows, чтобы найти соответствующий сеанс, но это больше не работает, AFAIK.
Мой совет:
- Проверьте браузер по умолчанию
- Для IE используйте код Icebob. Также используйте этот или ваш текущий код ShellExecute для браузеров, которые вы явно не поддерживаете.
- Для Firefox, проверьте developer.mozilla.org. Там обязательно должен быть какой-то путь.
- То же самое для веб-набора (Chrome, Safari) и Opera.
Или жить с дубликатами. В этом случае ваш код ShellExecute идеален.
Я бы, наверное, жил с дубликатами.
function EnumProcess(Handle: HWND; lParam: Integer): BOOL; stdcall;
var
PID : Cardinal;
Title : String;
begin
If Handle = NULL Then
begin
Result := False;
end
Else
begin
GetWindowThreadProcessID(Handle,PID);
If PID = lParam Then
begin
SetForegroundWindow(Handle);
Result := False;
end
else
Result := True;
end;
end;
procedure TMainForm.StartBrowser();
var
h: HWND;
S: tagPROCESSENTRY32;
bFound: boolean;
begin
h := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
S.dwSize := SizeOf(tagPROCESSENTRY32);
Process32First(h, S);
bFound := false;
while Process32Next(h, S) do
begin
if Pos('iexplore', LowerCase(S.szExeFile)) <> 0 then
begin
bFound := true;
EnumWindows(@EnumProcess,Integer(Pointer(S.th32ProcessID)));
end;
end;
if (not bFound) then
ShellExecute(Handle, 'open', 'http://www.stackru.com', nil, nil, SW_SHOWNORMAL);
end;
Лучше всего использовать DDE, чтобы найти существующее окно.
Кроме того, жесткое кодирование открытого глагола не является хорошей идеей, лучше передать NULL/nil