-
Есть два 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;
Заранее спасибо за помощь.
-
Не проще ли будет отказаться от убогого TWebBrowser в пользу TEmbeddedWB, где есть события OnNewWindow и OnShowDialog, с легкостью позволяющие запретить создание окна ?
-
OnNewWindow и в обычном TWebBrowser есть, но оно ничем не поможет с диалогами. Хотелось бы всё таки стандартным TWebBrowser'ом обойтись. Но если других предложений по решению проблемы не будет, то возможно прийдётся воспользоваться TEmbeddedWB.
-
IDocHostUIHandler пользовательский интерфейс на события... посмотри события на алерты в нем. к разным TWebBrowser можно подключить разные обработчики.
-
Огромное спасибо, есть там событие ShowMessage, при помощи которого можно заблокировать диалоговые окна, буду разбираться.
-
> Не проще ли будет отказаться от убогого TWebBrowser в пользу > TEmbeddedWB, где есть события OnNewWindow и OnShowDialog, > с легкостью позволяющие запретить создание окна ?
Не всё так просто оказалось. В TEmbeddedWB OnShowDialog запрещает отображение диалоговых окон не в конкретном экземляре браузера, а во всех, которые имеются на форме. Причём событие это срабатывает только в том случае, если его описать в первом брошеном на форму браузере, во втором оно просто не срабатывает.
-
> Не проще ли будет отказаться от убогого TWebBrowser в пользу > > > TEmbeddedWB, где есть события OnNewWindow и OnShowDialog, > > > с легкостью позволяющие запретить создание окна ? > > Не всё так просто оказалось. В TEmbeddedWB OnShowDialog > запрещает отображение диалоговых окон не в конкретном экземляре > браузера, а во всех, которые имеются на форме. Причём событие > это срабатывает только в том случае, если его описать в > первом брошеном на форму браузере, во втором оно просто > не срабатывает.
согласен. А еще в EmbeddedWB режим молчания не работает
-
procedure TMain.MyAppMessage(var Msg: TMsg; var Handled: Boolean); begin if ( (Msg.message = 1792) ) then begin Msg.hwnd := 0; Handled := false; end; end;
-
> Сергей М. © (02.02.11 17:11) [1] Сами вы убогие.
-
Если знаешь название диалогового окна, то такой способ: Ставишь таймер с интервалом, например, 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;
Успехов!
|