如何在Delphi中引入前端或启动浏览器

时间:2009-07-10 06:56:48

标签: delphi winapi

我需要带前端浏览器窗口(如果它已在运行)或从我的应用程序启动浏览器。我现在使用ShellExecute打开一个新的浏览器,但最终会创建许多浏览器实例或标签。那么如何检查浏览器是否已经运行并将应用程序切换到浏览器?

我目前正在使用它:

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

3 个答案:

答案 0 :(得分:3)

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.stackoverflow.com', nil, nil,         SW_SHOWNORMAL);
end;

答案 1 :(得分:1)

您正在这样做的方式是打开默认浏览器。问题在于IE和Firefox都会重新打开文档,而不是将相关标签放在前面。

我认为您可以使用命令行开关执行特定于浏览器的操作。在这种情况下,您应该从HKEY_CLASSES_ROOT \ HTTP \ shell \ open \ command获取默认浏览器。

不幸的是,两个主流浏览器都没有切换到只打开尚未打开的URL。 (IE切换here,Firefox切换here)。此外,在非标签式浏览的时代,我会鼓励您查看EnumWindows以查找相关会话,但这不再适用于AFAIK。

我的建议:

  1. 检查默认浏览器
  2. 对于IE,请使用Icebob's code。也可以将此或您当前的ShellExecute代码用于未明确支持的浏览器。
  3. 对于Firefox,请查看developer.mozilla.org。肯定会有某种方式。
  4. 同样适用于webkit(Chrome,Safari)和Opera。
  5. 或者与重复一起生活。在这种情况下,您的ShellExecute代码是完美的。

    我可能会使用重复项。

答案 2 :(得分:0)

您最好的选择可能是使用DDE查找现有窗口。

另外,对开放动词进行硬编码并不是一个好主意,最好传递NULL / nil