Delphi DCEF3:如何获取屏幕截图

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

如何在DCEF3中获取浏览器的屏幕截图

我创建这样的浏览器没有VCL。
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;
    

这基本上是屏幕外渲染。在DCEF3的demos文件夹中,您可以找到一个“屏幕外”项目。您要查找的代码位于
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
(编译时出错)。