Как вывести фронтальный или запустить браузер в Delphi

Мне нужно либо вывести переднее окно браузера, если оно уже запущено, либо запустить браузер из моего приложения. Сейчас я использую ShellExecute, чтобы открыть новый браузер, но в конечном итоге он создаст много экземпляров или вкладок браузера. Так как проверить, запущен ли браузер, и переключить приложение на браузер?

Я в настоящее время использую это:

ShellExecute(Handle, 'open', URL, nil, nil, SW_SHOWNORMAL);

3 ответа

Решение

То, как вы это делаете, это способ открыть браузер по умолчанию. Проблема заключается в том, что IE и Firefox всегда будут открывать документ вместо того, чтобы вывести соответствующую вкладку вперед.

Я подумал, что вы могли бы делать что-то для браузера с помощью переключателей командной строки. В этом случае вы должны получить браузер по умолчанию с помощью команды HKEY_CLASSES_ROOT\HTTP\shell\open\.

К сожалению, ни один из двух основных браузеров не имеет переключателя, чтобы открывать только URL, который еще не открыт. (IE переключается здесь, Firefox переключается здесь). Кроме того, в дни просмотра без вкладок я бы посоветовал вам взглянуть на EnumWindows, чтобы найти соответствующий сеанс, но это больше не работает, AFAIK.

Мой совет:

  1. Проверьте браузер по умолчанию
  2. Для IE используйте код Icebob. Также используйте этот или ваш текущий код ShellExecute для браузеров, которые вы явно не поддерживаете.
  3. Для Firefox, проверьте developer.mozilla.org. Там обязательно должен быть какой-то путь.
  4. То же самое для веб-набора (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

Другие вопросы по тегам