Вы используете компонент TWebBrowser для отображения HTML-контента в вашем приложении на Delphi. Вопрос заключается в необходимости предотвратить клики по ссылкам, отображаемым в TWebBrowser, но при этом сохранить возможность программной навигации. Вы уже пытались использовать событие OnBeforeNavigate2, которое обнаруживает клики по ссылкам, но также реагирует на программные вызовы метода Navigate. В результате, навигация не происходит вообще.
Попытки обернуть вызов Navigate и проверка состояния перед навигацией не привели к успеху. Вопрос состоит в том, как отличить навигацию, инициированную пользователем, от программной навигации.
Подход к решению
Для решения этой проблемы можно использовать параметр Flags в событии OnBeforeNavigate2. Если значение параметра Flags равно 64, это означает, что навигация была инициирована пользователем. Если значение равно 0, то навигация была вызвана методом IWebBrowser2::Navigate. В коде на Object Pascal это выглядит следующим образом:
procedure TForm1.WebBrowser1BeforeNavigate2(ASender: TObject;
const pDisp: IDispatch; const URL, Flags, TargetFrameName, PostData,
Headers: OleVariant; var Cancel: WordBool);
begin
if (Flags and navHyperlink) = navHyperlink then
// Пользователь кликнул по ссылке
Cancel := True; // Отмена навигации
else
// Программная навигация
// Здесь можно выполнить другие действия, если необходимо
end;
Этот подход основан на использовании недокументированного флага, который работает, по крайней мере, в некоторых версиях Internet Explorer на Windows. Обратите внимание, что использование недокументированных функций может быть нестабильным и не рекомендуется для использования в производственных приложениях.
Альтернативный подход
В качестве альтернативы, вы можете использовать событие wb1NewWindow3, которое вызывается, когда пользователь пытается открыть новую вкладку или окно. В этом событии можно получить полный URL, по которому был совершен клик, и выполнить внешнюю навигацию, используя ShellExecute. Пример кода:
uses Winapi.ShellAPI, UnitFaktorMain, MsHtml;
procedure TfrmIntro.wb1NewWindow3(ASender: TObject; var ppDisp: IDispatch; var Cancel: WordBool; dwFlags: Cardinal; const bstrUrlContext, bstrUrl: WideString);
var
vAdr : string;
begin
Cancel := True;
try
vAdr := ((TWebBrowser(ASender).Document as IHTMLDocument2).ActiveElement as IHTMLElement).GetAttribute('href', 0);
except
vAdr := bstrUrl;
end;
ShellExecute(Handle,
'open',
PWideChar(vAdr),
nil,
nil,
SW_SHOW);
end;
Используя этот подход, вы можете перехватывать попытки навигации пользователя и открывать ссылки во внешнем браузере, не блокируя при этом программную навигацию в вашем приложении.
Заключение
В статье были рассмотрены два подхода к обработке событий кликов по ссылкам в TWebBrowser. Первый подход основан на использовании параметра Flags в событии OnBeforeNavigate2, что позволяет отличить навигацию, инициированную пользователем, от программной. Второй подход использует событие wb1NewWindow3 для перехвата и обработки внешних навигационных запросов. Выбор подхода зависит от специфики вашего приложения и предпочтений в разработке.
Контекст описывает проблему обработки событий кликов по ссылкам в компоненте TWebBrowser в Delphi, где необходимо отличать клики, совершенные пользователем, от программной навигации.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.