c++ - 在默认浏览器中加载 URL 并置于前面
问题描述
我有一个使用直接 winapi 用 C++ 编写的全屏应用程序。该应用程序包含一个嵌入式 Web 浏览器(使用 CEF,但在这种情况下我认为这并不重要)。由于单击链接并使用 ShellExecute 在系统默认浏览器中打开它们,我目前正在拦截任何弹出窗口。但是,在我们的许多测试系统上,浏览器窗口显示在我的应用程序窗口后面,这是一个问题,因为我的窗口覆盖了任务栏,因此用户没有任何迹象表明已显示新窗口。
我已经阅读了可以在此站点和其他站点上找到的所有内容,但找不到一个可行的解决方案:
- 使用 ShellExecuteEx 获取进程句柄,然后使用进程句柄找到窗口句柄并将其带到前面 - 很多时候进程句柄为 NULL,这似乎与浏览器在现有窗口中打开新选项卡有关。此外,如果 Edge 是默认浏览器,那么进程句柄似乎总是为 NULL。
- 使用 ShellExecute(或 Ex)然后根据名称查找新窗口 - 我不知道窗口的名称是什么。它基于打开的内容,根据用户单击的链接(html、pdf 等),可能会有很多不同的内容。
- 试图找出默认浏览器的路径,然后使用 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 ) )
解决方案
推荐阅读
- javascript - axios实例promise.all错误处理
- sql - SELECT $b 没有将智能感知显示为错误,但会引发错误。这种情况背后的原因是什么?
- python - 尝试在opencv imread函数中使用多个图像但没有得到
- laravel - 当我运行命令 npm install 它给出错误 npm ERR cb() never called
- angular - 在 Angular 中从剪贴板粘贴图像不起作用
- php - BadMethodCallException 方法 Illuminate\Database\Eloquent\Collection::paginate 不存在
- javascript - 将项目放入列表框中 - 在 Angularjs 中说“选择几个月后选择”是什么意思?
- python - 使用 Python bigquery_datatransfer 创建 adwords BigQuery Transfer:错误 400 请求包含无效参数
- c - Is it possible to access/update the child thread's resource from parent thread?
- java - Why do we use matrices?