目前,我已经将TWebBrowser嵌入到一个应用程序中,该应用程序可以"记录"在线游戏中的活动,以便可以向用户显示有关该游戏的统计信息。这目前工作正常,但TWebBrowser似乎比TChromium慢得多。因此,我开始转换我的项目以利用Delphi TChromium嵌入式框架(CEF)-3,从: https://bitbucket.org/chromiumembedded/
从这里我拿了 guiclient,它可以在下载的演示目录中找到。
到目前为止一切顺利 - 但是,在收到对"crmBrowserLoadEnd"的调用之前,用户似乎能够按下按钮离开其当前页面。这导致我的程序错过了数据。
作为替代方案,我认为可以检查哪些资源完成其个人下载。我可以挂接事件"crmBrowserBeforeResourceLoad"以查看哪些资源"开始"加载。但是似乎没有任何事件可以告诉我资源已完成加载。
procedure TFrmDBrowser.crmBrowserBeforeResourceLoad(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; const request: ICefRequest; out Result: Boolean);
var
u: TUrlParts;
Item: TListItem;
begin
item := LvDataView.Items.Add();
item.Caption := request.Url;
end;
因此,它归结为:
- 问:如何要求/告诉 CEF 为已下载的单个资源提供事件,以便我可以在下载索引时读取索引.htm索引。(而不是等待整个页面和所有资源完成加载)
- 答:使用"crmBrowserLoadStart"而不是"crmBrowserLoadEnd"。以确保它可以在浏览器启动之前抓取网址下载的文件。
- 问:如何阻止所有用户输入,直到整个文档完成加载并且 crmBrowserLoadEnd 完成。(虽然这不太受欢迎,因为它会降低用户对浏览器的享受):
- 答:更新:捕获"crmBrowserPreKeyEvent"并添加"如果FLoading则结果:= True;"将确保用户无法使用键盘进行导航。设置 crmBrowser.已启用 := 假,.将确保用户无法使用鼠标导航。
从Facebook Delphi小组得到答案,作者:Shariful Alam Khan。"使用 OnLoadStart 事件"
事实证明,这正是上述示例的最佳方法。
源示例:
procedure DataExtractionCallback(const Html: uString);
begin
try
FrmDBrowser.RunDataExtraction(Html);
except
//
end;
end;
procedure TFrmDBrowser.crmBrowserLoadStart(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame);
var
CefStringVisitor: ICefStringVisitor;
URL: String;
begin
if not IsMain(browser, frame) then
Exit;
FLoading := True;
CefStringVisitor := TCefFastStringVisitor.Create(DataExtractionCallback);
crmBrowser.Browser.MainFrame.GetSource(CefStringVisitor);
end;