dcef3 指出一个坑
http://ju.outofmemory.cn/entry/80119
dcef3提供了TChromium,可能会有人想用这个来开发游览器
可惜这个实现起来有问题
问题就出在OnBeforePopup这个事件上
很多人以为只要在这做一个拦截
让新的TChromium来加载这个新网页即可
这是一个大坑,我之前发布的游览器也是这样
get可能表面上还看不出什么问题,
但如果是个post请求,问题就大了
一个好好的post在我们这个所谓的游览器里莫名其妙的变成了get请求
所以开发游览器最好的方法就是不要去用这个TChromium
或者说凡是涉及到不是那种简单跳转网页的,都不要用TChromium
你会进坑的
自己用底层的dcef3
在这里我放出一段核心代码(参考TChromium的源码)
另外你还需要自己处理消息循环 CefDoMessageLoopWork
procedure CreateBrowser;
var
info: TCefWindowInfo;
settings: TCefBrowserSettings;
begin
if (FParentRect.IsEmpty) or (FParentHandle = 0) then Exit;
FillChar(info, SizeOf(info), 0);
info.Style := WS_CHILD or WS_VISIBLE or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or WS_TABSTOP;
info.parent_window := FParentHandle;
info.x := FParentRect.left;
info.y := FParentRect.top;
info.Width := FParentRect.right - FParentRect.left;
info.Height := FParentRect.bottom - FParentRect.top;
FillChar(settings, SizeOf(TCefBrowserSettings), 0);
settings.size := SizeOf(TCefBrowserSettings);
GetSettings(settings);
{$IFDEF CEF_MULTI_THREADED_MESSAGE_LOOP}
CefBrowserHostCreate(@info, FHandler, FDefaultUrl, @settings,
TCefRequestContextRef.CreateContext((FHandler as ICefClientHandler).GetRequestContextHandler));
{$ELSE}
CefLoadLibDefault;
FBrowser := CefBrowserHostCreateSync(@info, FClientHandler, FDefaultUrl, @settings,
TCefRequestContextRef.CreateContext((FClientHandler as ICefClientHandler).GetRequestContextHandler));
FBrowserId := FBrowser.Identifier;
{$ENDIF}
end;
delphi lazarus opengl
网页操作自动化, 图像分析破解,游戏开发