首页 > 解决方案 > 在默认浏览器中加载 URL 并置于前面

问题描述

我有一个使用直接 winapi 用 C++ 编写的全屏应用程序。该应用程序包含一个嵌入式 Web 浏览器(使用 CEF,但在这种情况下我认为这并不重要)。由于单击链接并使用 ShellExecute 在系统默认浏览器中打开它们,我目前正在拦截任何弹出窗口。但是,在我们的许多测试系统上,浏览器窗口显示在我的应用程序窗口后面,这是一个问题,因为我的窗口覆盖了任务栏,因此用户没有任何迹象表明已显示新窗口。

我已经阅读了可以在此站点和其他站点上找到的所有内容,但找不到一个可行的解决方案:

  1. 使用 ShellExecuteEx 获取进程句柄,然后使用进程句柄找到窗口句柄并将其带到前面 - 很多时候进程句柄为 NULL,这似乎与浏览器在现有窗口中打开新选项卡有关。此外,如果 Edge 是默认浏览器,那么进程句柄似乎总是为 NULL。
  2. 使用 ShellExecute(或 Ex)然后根据名称查找新窗口 - 我不知道窗口的名称是什么。它基于打开的内容,根据用户单击的链接(html、pdf 等),可能会有很多不同的内容。
  3. 试图找出默认浏览器的路径,然后使用 CreateProcess 启动它 - 到目前为止,如果 Edge 是默认浏览器,我还没有运气(因为显然 Edge 是一个没有可执行文件的“现代”应用程序可以使用 CreateProcess 启动)。如果有人知道如何完成这项工作,我可以看到这实际上是一个不错的解决方案。

因此,现在我正沿着一条在启动浏览器之前和之后枚举所有窗口的路径,并试图找出哪个是正确的。我正在设想可能发生的各种问题(例如,在现有浏览器上打开一个选项卡)。如果有人对此问题有任何解决方案,我将不胜感激!

编辑:我用于 ShellExecuteEx 的代码:

SHELLEXECUTEINFO sxi = { 0 };
sxi.cbSize = sizeof( sxi );
sxi.nShow = SW_NORMAL;
sxi.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_NOASYNC | SEE_MASK_WAITFORINPUTIDLE;
sxi.lpVerb = _T( "open" );
sxi.lpFile = url;
if( ShellExecuteEx( &sxi ) )

标签: c++winapi

解决方案


推荐阅读