Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Отловить и "убить" диалоговое окно из TWebBrowser. [D7, Win2k, WinXP]


igor666 ©   (02.02.11 13:28

Есть два WebBrowser'а, нужно отлавливать и уничтожать все диалоговые окна (например window.alert), которые вызываются из одного браузера и не трогать те, которые вызываются из другого.
В интернете нашёл пимер, как гасить все диалоговые окна по по классу и заголовку, но как привязаться к конкретному браузеру, не могу придумать.
Вот этот пример:

procedure TForm1.WMActivate(var Msg: TWMActivate);
begin
 TrapWM_Activate(Msg);
 inherited;
end;

procedure TForm1.TrapWM_Activate(var Msg: TWMActivate);
var
 L:Integer;
 wnd:Integer;
 WinClass,WinCaption:string;
 ShouldShow:boolean;
 ShouldClose:boolean;
begin
if Msg.Active = 0 then
 begin
 wnd := Msg.ActiveWindow;
 SetLength(WinClass,80);
 SetLength(WinClass,GetClassName(wnd, PChar(WinClass), Length(WinClass)));
 L:=GetWindowTextLength(wnd);
 SetLength(WinCaption,L+1);
 GetWindowText(Wnd,PChar(WinCaption),L+1);
 SetLength(WinCaption,L);
 ShouldShow:=(WinCaption<>'');
 memo1.Lines.Add(WinCaption + ' - ' + WinClass + ' - ' + IntToStr(GetParent(wnd)));
 if ShouldShow then
   begin
   ShouldClose:=(WinCaption='Microsoft Internet Explorer') and (WinClass='#32770');
   if not ShouldClose then SendMessage(wnd, WM_CLOSE, 0, 0);
   end;
 end;
end;

Заранее спасибо за помощь.


Сергей М. ©   (02.02.11 17:11[1]

Не проще ли будет отказаться от убогого TWebBrowser в пользу TEmbeddedWB, где есть события OnNewWindow и OnShowDialog, с легкостью позволяющие запретить создание окна ?


igor666 ©   (02.02.11 18:39[2]

OnNewWindow и в обычном TWebBrowser есть, но оно ничем не поможет с диалогами. Хотелось бы всё таки стандартным TWebBrowser'ом обойтись. Но если других предложений по решению проблемы не будет, то возможно прийдётся воспользоваться TEmbeddedWB.


sniknik ©   (03.02.11 08:07[3]

IDocHostUIHandler
пользовательский интерфейс на события... посмотри события на алерты в нем. к разным TWebBrowser можно подключить разные обработчики.


igor666 ©   (03.02.11 18:21[4]

Огромное спасибо, есть там событие ShowMessage, при помощи которого можно заблокировать диалоговые окна, буду разбираться.


igor666 ©   (07.02.11 12:55[5]


> Не проще ли будет отказаться от убогого TWebBrowser в пользу
> TEmbeddedWB, где есть события OnNewWindow и OnShowDialog,
>  с легкостью позволяющие запретить создание окна ?

Не всё так просто оказалось. В TEmbeddedWB OnShowDialog запрещает отображение диалоговых окон не в конкретном экземляре браузера, а во всех, которые имеются на форме. Причём событие это срабатывает только в том случае, если его описать в первом брошеном на форму браузере, во втором оно просто не срабатывает.


anton773   (12.02.11 20:12[6]


>  Не проще ли будет отказаться от убогого TWebBrowser в пользу
>
> > TEmbeddedWB, где есть события OnNewWindow и OnShowDialog,
>
> >  с легкостью позволяющие запретить создание окна ?
>
> Не всё так просто оказалось. В TEmbeddedWB OnShowDialog
> запрещает отображение диалоговых окон не в конкретном экземляре
> браузера, а во всех, которые имеются на форме. Причём событие
> это срабатывает только в том случае, если его описать в
> первом брошеном на форму браузере, во втором оно просто
> не срабатывает.

согласен. А еще в EmbeddedWB режим молчания не работает


nomes   (21.05.11 19:52[7]

procedure TMain.MyAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
if ( (Msg.message = 1792) ) then
 begin
   Msg.hwnd := 0;
   Handled := false;
 end;
end;


знайка   (21.05.11 20:27[8]


> Сергей М. ©   (02.02.11 17:11) [1]
Сами вы убогие.


Nikolay ©   (04.05.17 19:32[9]

Если знаешь название диалогового окна, то такой способ:
Ставишь таймер с интервалом, например, 1 раз в секунду и...

procedure TForm1.Timer1Timer(Sender: TObject);
var
H: HWND;
rName: array [0..255] of Char;
begin
 H:=GetForegroundWindow;
 GetWindowText(H,rName,255);
 if (rName = 'Сообщение с веб-страницы') then
 begin
   SendMessage(H, WM_SYSCOMMAND, SC_CLOSE, 0);
 end;
end;

Успехов!


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо