Странно, что так мало ресурсов по Delphi/FPC+CEF3. Вероятно, это связано с малой вообще популярностью этих языков. Но я кое-что уже сам наковырял из исходников. Например, теперь умею ажнык двумя способами вынимать текст из браузера: через GetSourceProc и GetSource.
GetSource лучше тем, что в обработчик можно параметры передавать. Странновато, что процедура в GetSourceProc объявлена как единственный стринг без доп. параметров.
Ну и про передачу сообщений, вроде бы, разобрался. Там, по сути, идеологически не особо сложно: в API задействованы всего два PID-а, BROWSER и RENDERER. Проблема в организации безглючного взаимодействии процессов и отладке.
- Код: Выделить всё
procedure StringVisitor(const str: ustring);
begin
MainForm.lbUrl.Caption := MainForm.crm.Browser.MainFrame.Url;
MainForm.Memo1.Lines.Text := str;
end;
procedure TMainForm.crmLoadEnd(Sender: TObject;
const Browser: ICefBrowser; const Frame: ICefFrame; httpStatusCode: Integer);
var
res:boolean;
begin
if Assigned(Frame) and Frame.IsMain and (httpStatusCode = 200) then
crm.Browser.MainFrame.GetSourceProc(@StringVisitor);
end;
- Код: Выделить всё
TCefStringVisitor = class(TCefStringVisitorOwn)
private
FBrowser: ICefBrowser;
protected
procedure Visit(const str: ustring); override;
constructor Create(const browser: ICefBrowser);
end;
procedure TCefStringVisitor.Visit(const str: ustring);
begin
MainForm.lbUrl.Caption := MainForm.crm.Browser.MainFrame.Url;
MainForm.Memo1.Lines.Text := str;
end;
constructor TCefStringVisitor.Create(const browser: ICefBrowser);
begin
inherited Create;
FBrowser := browser;
end;
procedure TMainForm.crmLoadEnd(Sender: TObject;
const Browser: ICefBrowser; const Frame: ICefFrame; httpStatusCode: Integer);
var
res:boolean;
begin
if Assigned(Frame) and Frame.IsMain and (httpStatusCode = 200) then
crm.Browser.MainFrame.GetSource(TCefStringVisitor.Create(Browser));
end;