【问题标题】:How to bring front or launch browser in Delphi如何在 Delphi 中引入前端或启动浏览器
【发布时间】:2010-11-09 15:13:10
【问题描述】:

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

我目前正在使用这个:

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

【问题讨论】:

    标签: delphi winapi


    【解决方案1】:
    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;
    

    【讨论】:

    • 这个好像是IE特有的,那默认浏览器呢?
    • ..这不起作用,如果IE在后台运行,它不会恢复到前台窗口。
    • 我以为你可以搜索如何获得默认浏览器....但答案是:HKEY_LOCAL_MACHINE\Software\Clients\StartMenuInternet\ 默认值表示默认的网络浏览器。
    • Icebob:实际上,这是开始菜单顶部显示的浏览器路径,可以不同。据我所知,默认浏览器位于 HKEY_CLASSES_ROOT\HTTP\shell\open\command。
    • 根据 Cobus Kruger 的评论,我认为是选项卡式浏览器(使用 IE 和 Chrome 测试)导致 EnumWindows 出现问题。
    【解决方案2】:

    您这样做的方式是打开默认浏览器的方式。问题在于 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。

    或与重复项一起生活。在这种情况下,您的 ShellExecute 代码是完美的。

    我可能会忍受重复。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多