Конференция "Сети" » Отловить и "убить" диалоговое окно из TWebBrowser. [D7, Win2k, WinXP]
 
  • igor666 © (02.02.11 13:28) [0]
    Есть два 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;

    Успехов!
 
Конференция "Сети" » Отловить и "убить" диалоговое окно из TWebBrowser. [D7, Win2k, WinXP]
Есть новые Нет новых   [118447   +34][b:0][p:0.001]