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