Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Обработка событий кликов по ссылкам в TWebBrowser: программная навигация против действий пользователя

Delphi , Интернет и Сети , Браузер

Вы используете компонент 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Браузер ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-20 22:29:50/0.0020160675048828/0