Загрузить URL в браузере по умолчанию и перенести на передний план - PullRequest
0 голосов
/ 15 марта 2019

У меня полноэкранное приложение, написанное на c ++ с использованием прямой winapi. Приложение содержит встроенный веб-браузер (с использованием 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 ) )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...