Delphi DCEF3:如何获取屏幕截图
如何在DCEF3中获取浏览器的屏幕截图 我创建这样的浏览器没有VCL。Delphi DCEF3:如何获取屏幕截图,delphi,delphi-xe5,chromium-embedded,tchromium,Delphi,Delphi Xe5,Chromium Embedded,Tchromium,如何在DCEF3中获取浏览器的屏幕截图 我创建这样的浏览器没有VCL。TakePicture方法仅在以下情况下有效 没有使用调试器 如果使用ShowWindow var info: TCefWindowInfo; Settings: TCefBrowserSettings; begin FillChar(info, SizeOf(info), 0); info.width := width; info.height := height; FillChar(Setting
TakePicture
方法仅在以下情况下有效
- 没有使用调试器
- 如果使用ShowWindow
var info: TCefWindowInfo; Settings: TCefBrowserSettings; begin FillChar(info, SizeOf(info), 0); info.width := width; info.height := height; FillChar(Settings, SizeOf(TCefBrowserSettings), 0); Settings.Size := SizeOf(TCefBrowserSettings); GetSettings(Settings); CefBrowserHostCreateBrowser(@info, FHandler, FDefaultUrl, @settings, nil); end; procedure TakePicture(const Browser: ICefBrowser; Height, Width: Integer); var DC: HDC; Bmp : TBitmap; Handle : HWND; Rect : trect; BarHeight : integer; BarLeft : integer; begin Bmp := TBitmap.Create; Bmp.PixelFormat := pf32bit; Handle := Browser.Host.WindowHandle; ShowWindow(handle, SW_RESTORE); // will work only if this is used otherwise black image! BarLeft := GetSystemMetrics(SM_CXFRAME); BarHeight := GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME); GetWindowRect(Handle, Rect); DC := GetDC(Handle); Bmp.Width := Rect.Right - Rect.Left; Bmp.Height := (Rect.Bottom - Rect.Top); BitBlt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, DC, -BarLeft, -BarHeight, SRCCOPY); ReleaseDC(Handle, DC); Bmp.SaveToFile('c:\test.bmp'); Bmp.Free; end;
TChromiumOSR
的OnPaint
事件中。它渲染为一个位图,但任何位图都可以正常工作。请注意,它已优化为仅绘制所谓的“脏”区域(自上次绘制以来已更改的区域),但如果您正在制作屏幕截图,这不是您想要的。在我对存储库的签出中,有一行被注释掉了,显示了只是绘制所有内容的天真案例:
SomeBitmap.SetSize(width, height);
Move(buffer^, SomeBitmap32.Bits^, width * height * 4);
我猜这个神奇的数字4
代表4个字节(32位)
我强烈建议您使用Graphics32,但如果您必须使用常规的TBitmap,我将让您自行决定如何将位数组转换为像素。加热可能会慢得多。这不管用吗?请用您正在使用的当前失败的实际快照代码更新您的问题。@Jandogen没问题。:)你不能只使用
ceffetbitmap
函数吗?@TLama我认为DCEF3不支持它。这个答案没有多大帮助。需要具体的例子。@user3655788我的答案基本上告诉你在哪里可以找到这个例子。我得到一张黑色的图片。我怀疑我是否需要使用屏幕外渲染来获得一个简单的屏幕截图。这是给firemonkey的。@user3655788试试那个演示;它起作用了。在TPaintBox32
呈现TBitmap32
之前,这里实际上没有涉及任何VCL。仔细看一下,并将其转换为您自己的代码,但基本上可以归结为以上内容。“简单的屏幕截图”仍然需要呈现网站。如果尚未将其呈现到表单中(在这种情况下,您可以使用提供的链接@Jandogen),则需要在屏幕外呈现。@user3655788该演示可能遇到的唯一问题是,您需要将事件。键入
更改为事件.kind
(编译时出错)。