我用TWebBrowser和PageControl写浏览器,如果遇到很多弹出式窗口的网站,比如“华军软件园”进入它的网站会弹出一些广告,但是我的程序并没有打开那个广告网页,PageControl是新建了页面来打开,可是网页并没有显示出来,整个页面是灰度的。这种情况只发生在有弹出式广告的网站和CGI弹出窗口,还有不仅网页显示不出来,而且还会出现这样的错误信息:Could not obtain OLE control window handle。这是怎么回事?
下面是TWebBrowser的OnNewWindow2过程:
procedure TMainForm.OnNewWindow2(Sender: TObject; var ppDisp: IDispatch;
var Cancel: WordBool);
var
n:Integer;
tabwb:TTabSheetWithEM;{这是我自己写的一个类,把TWebBrowser和TTabSheet组合在一起了}
begin
PageControl.Parent:=MainForm;
tabwb:=TTabSheetWithEM.Create(self);
tabwb.PageControl:=self.PageControl;
tabwb.WebBrowser.ParentWindow:=tabwb.Handle;
TWinControl(tabwb.WebBrowser).Parent:=tabwb;
tabwb.WebBrowser.Align:=alclient;
for n:=0 to PageControl.PageCount-1 do
ppdisp:=((self.PageControl.Pages[n]) as TTabSheetWithEM).WebBrowser.Application;
end;
还需要说明一点的是,我用IE或其他的浏览器,发现他们遇到这些CGI弹出窗口时都很快的自动将其关闭了。
在pagecontrol的onchange里面写:
webbrowser.width:=webbrowser.width+1;
webbrowser.width:=webbrowser.width-1;
搞定!
还好我的浏览器在“华军软件园”没问题!
问题在用脚本关闭WebBrowser上!
初始化OLE对象!
加上,用来在关闭WebBrowser后关闭PAGE!
procedure TMainForm.ApplicationMessage(var Msg: TMsg; var Handled: Boolean);
var
WB:TWebBrowser;
begin
WB:=((self.PageControl.ActivePage) as TTabSheetWithEM).WebBrowser;
if (Msg.message = WM_CLOSE) and (Msg.hwnd = WB.Handle) then
begin
((self.PageControl.ActivePage) as TTabSheetWithEM).Free;
end
else
inherited;
end;
下面的代码有问题!
for n:=0 to PageControl.PageCount-1 do
ppdisp:=((self.PageControl.Pages[n]) as TTabSheetWithEM).WebBrowser.Application;
self.PageControl.ActivePage:=tabwb;
ppDisp := tabwb.WebBrowser.DefaultInterface;