在默认浏览器中加载URL并置于最前面

时间:2019-03-15 17:50:34

标签: c++ winapi

我有一个使用直接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 ) )

0 个答案:

没有答案