В современном веб-разработке часто возникает необходимость управления поведением браузера, в том числе и перехвата всплывающих окон. Рассмотрим, как это можно сделать, используя компонент TEdgeBrowser в среде разработки Delphi.
Проблема
Разработчики, использующие TEdgeBrowser, сталкиваются с необходимостью перехвата событий, связанных с открытием новых окон. В частности, событие OnNewWindowRequested позволяет определить, что браузер готовится открыть новое окно, но возникает вопрос: как можно перенаправить этот вывод на собственную форму с вторым компонентом TEdgeBrowser?
Решение
Событие OnNewWindowRequested в TEdgeBrowser предоставляет параметр Args типа TNewWindowRequestedEventArgs, который, в свою очередь, реализует интерфейс ICoreWebView2NewWindowRequestedEventArgs из Edge WebView2. Для перенаправления на новое окно можно использовать метод Set_NewWindow(), передав ему интерфейс желаемого браузера, который можно получить через свойство DefaultInterface компонента TEdgeBrowser.
procedure TForm1.EdgeBrowser1NewWindowRequested(Sender: TObject; Args: TNewWindowRequestedEventArgs);
begin
Args.ArgsInterface.Set_NewWindow(EdgeBrowser2.DefaultInterface);
end;
Пример кода
В приведенном выше коде мы создаем обработчик события OnNewWindowRequested для компонента TEdgeBrowser1. В этом обработчике мы перехватываем событие открытия нового окна и перенаправляем его на компонент TEdgeBrowser2, который размещен на пользовательской форме.
// Предположим, что EdgeBrowser2 уже существует на вашей форме
procedure TForm1.EdgeBrowser1NewWindowRequested(Sender: TObject; Args: TNewWindowRequestedEventArgs);
begin
Args.ArgsInterface.Set_NewWindow(EdgeBrowser2.DefaultInterface); // EdgeBrowser2 - это ваш второй компонент TEdgeBrowser
end;
Не забудьте подключить обработчик событий к вашему TEdgeBrowser1, чтобы он активировался при попытке открыть новое окно.
Важные замечания
Некоторые пользователи сталкивались с трудностями, связанными с версиями компонентов. Убедитесь, что используете актуальные версии библиотек и компонентов, совместимых с вашей версией Delphi (например, Delphi 10.4.1 Sydney). Также важно правильно обращаться к свойствам и методам компонентов.
Успешный исход
Некоторые разработчики сообщали о том, что метод put_NewWindow() не работал для них, но использование метода Set_NewWindow() помогло решить проблему. В случае возникновения трудностей, рекомендуется тщательно проверить код на предмет ошибок и убедиться, что все ссылки на компоненты и их свойства корректны.
Альтернативный способ
Также стоит отметить, что существуют альтернативные подходы, например, использование события EdgeBrowser1CreateWebViewCompleted для настройки контекстного меню браузера. Однако это не прямо относится к перенаправлению окон, а больше к настройке поведения уже существующего окна браузера.
var
s: ICoreWebView2Settings;
begin
Sender.DefaultInterface.Get_Settings(s);
s.Set_AreDefaultContextMenusEnabled(False);
end;
Используйте данный код осторожно, поскольку он влияет на стандартное поведение браузера, и убедитесь, что это соответствует вашим требованиям и ожиданиям пользователя.
Перехват всплывающих окон в TEdgeBrowser и их перенаправление на пользовательскую форму с помощью обработки события `OnNewWindowRequested` и использования метода `Set_NewWindow` для указания нового целевого браузера.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.