【发布时间】:2012-06-28 16:58:33
【问题描述】:
我正在尝试什么:
我需要一个 TWebBrowser,它总是放大 (~140%) 并将所有链接保存在同一个 webbrowser 中(即 _BLANK 链接应该在同一个浏览器控件中打开)。
我是怎么做的:
我已将注册表中的FEATURE_BROWSER_EMULATION 设置为9999,因此网页使用IE9 呈现。我已经确认这是有效的。此外,我正在全新安装的带有 IE9 的 Windows 7 上运行编译后的程序,并通过 Windows Update 进行了全面更新。
缩放:
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
ZoomFac: OLEVariant;
begin
ZoomFac := 140;
WebBrowser1.ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, ZoomFac);
end;
这很好用。
在同一浏览器控件中打开新窗口:
默认情况下,当 TWebBrowser 遇到设置为在新窗口中打开的链接时,它会打开一个新的 IE。我需要它留在我的程序/网络浏览器中。
我在这里尝试了很多东西。这对我有用:
procedure TFormWeb.WebBrowser1NewWindow3(ASender: TObject;
var ppDisp: IDispatch; var Cancel: WordBool; dwFlags: Cardinal;
const bstrUrlContext, bstrUrl: WideString);
begin
Cancel := True;
WebBrowser1.Navigate(bstrUrl);
end;
我取消了新窗口,而是直接导航到相同的 URL。
Internet 上各种页面上的其他来源建议我不要取消,而是将 ppDisp 设置为各种事物,例如 WebBrowser1.DefaultDispath 或 WebBrowser1.Application 以及它们的变体。这对我不起作用。当我单击 _BLANK 链接时,没有任何反应。这是在两台计算机(Win7 和 IE9)上测试的。我不知道为什么它不起作用,因为这似乎适用于互联网上的其他人。也许这会解决问题?
现在的问题:
当我将这两段代码组合起来时,它会中断!
procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate('http://wbm.dk/test.htm');
// This is a test page, that I created. It just contains a normal link to google.com
end;
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
ZoomFac: OLEVariant;
begin
ZoomFac := 140;
WebBrowser1.ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, ZoomFac);
end;
procedure TForm1.WebBrowser1NewWindow3(ASender: TObject; var ppDisp: IDispatch;
var Cancel: WordBool; dwFlags: Cardinal; const bstrUrlContext,
bstrUrl: WideString);
begin
Cancel := True;
WebBrowser1.Navigate(bstrUrl);
end;
运行时在浏览器中点击链接(无论是正常的还是_BLANK),都会产生这个错误:
First chance exception at $75F1B9BC. Exception class EOleException with message 'Unspecified error'. Process Project1.exe (3288)
如果我删除代码的任何一部分,它就可以工作(显然没有删除的代码)。
谁能帮我让这两个东西同时工作?
感谢您的宝贵时间!
更新:
现在这是正确捕获新窗口并将其保留在同一浏览器控件中的问题。据我所知,OnDocumentComplete 中的缩放代码与它无关。总的来说就是变焦。如果 WebBrowser 控件已被缩放(一次就足够了),NewWindow3 中的代码将失败并显示“未指定错误”。将缩放级别重置为 100% 没有帮助。
通过使用缩放代码 (ExecWB),WebBrowser 中的某些内容“永远”发生了变化,这使得它与 NewWindow3 中的代码不兼容。
有人能看出来吗?
新代码:
procedure TForm1.Button1Click(Sender: TObject);
var
ZoomFac: OLEVariant;
begin
ZoomFac := 140;
WebBrowser1.ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, ZoomFac);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.Navigate('http://www.wbm.dk/test.htm');
end;
procedure TForm1.WebBrowser1NewWindow3(ASender: TObject; var ppDisp: IDispatch;
var Cancel: WordBool; dwFlags: Cardinal; const bstrUrlContext,
bstrUrl: WideString);
begin
Cancel := True;
WebBrowser1.Navigate(bstrUrl);
end;
尝试在单击 Button1 之前和之后单击链接。缩放后失败。
【问题讨论】:
-
我看到了一些问题:您需要为每个弹出窗口创建新的 webbrowser 实例(考虑选项卡式浏览)。主要问题是 OnDocumentcomplete 事件可以触发多次(例如当页面有框架时),所以它不能执行 execwb 因为它仍然很忙。
-
我需要创建一个新实例吗?我不能重复使用吗?
-
你可以,但你为什么会呢?让我感到困惑的一件事是,这是您正在使用的普通 TWebbrowser,我签入了 XE,但我没有 NewWindow3 事件??
-
我正在为一台 kiosk PC 编程,它需要显示一些不同的网站。对我来说,将所有内容保存在一个实例中是最有意义的。关于事件,我有 2 个不同: WebBrowser1NewWindow2(ASender: TObject; var ppDisp: IDispatch; var Cancel: WordBool);和 WebBrowser1NewWindow3(ASender:TObject;var ppDisp:IDispatch;var Cancel:WordBool;dwFlags:Cardinal;const bstrUrlContext,bstrUrl:WideString);我使用 NewWindow3 因为它给了我 URL。您的任何 NewWindow 事件是否为您提供 URL?
-
您真的在使用 TWebbrowser(互联网标签)吗?正如我所说,我没有 OnNewWindow3 事件,我使用的版本比你的更高...
标签: delphi delphi-2010