PrintWindow()WebBrowser返回黑色图像

时间:2014-05-02 02:14:02

标签: c# .net delphi delphi-xe2

我正在制作一个可以在WebBrowser中打开Flash游戏并扫描像素的应用程序,所以我试图捕获我将要扫描的图像。这个应用程序将在后台运行(未最小化),所以我不能使用标准的截图捕获,这就是我使用PrintWindow函数捕获某些区域的原因。我使用EnumWindows获得MacromediaFlashPlayerActiveX HWND并尝试打印它的区域。虽然下面的代码来自Delphi,但我在C#上使用了相同的PrintWindow,我也得到了黑色图像,所以它与PrintWindow函数有关。尝试了webBrowser.DrawToBitmap - 仍然是黑色图像......

function PrintWindow(HWND:HWND;hdcBlt:HDC;nFlags:DWORD):BOOL; stdcall; external 'user32.dll'

function zPrintWindow(hHWND: HWND; Bmp: TBitmap): Boolean;
var
  r: TRect;
begin
  result := False;
  GetWindowRect(hHWND, r) ;
  bmp.Width := r.Right - r.Left;
  bmp.Height := r.Bottom - r.Top;
  bmp.PixelFormat:=pf24bit;
  result := PrintWindow(hHWND, Bmp.Canvas.Handle, 0) ;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  zPrintWindow(StrToInt(Edit1.Text), Image1.Picture.Bitmap);
  Image1.Refresh;
end;

我尝试捕捉屏幕的游戏是Wartune,但是在捕捉时,它会产生黑色图像。当尝试其他游戏时,我得到正确的图像。我还使用各种方法捕获了完整的表单,包括PrintWindow,但仍然 - WebBrowser是黑色的。为什么会这样?可能是因为游戏是高清晰度的吗?

这是PrintWindow的黑屏图片。 http://i.imgur.com/0V7mxbB.jpg 这是图片应该如何显示(使用Alt + PrintScreen捕获)。 http://i.imgur.com/YxX0hkA.png 这是用PrintWindow拍摄好的其他游戏的图片。 http://i.imgur.com/NcWyMOe.jpg

1 个答案:

答案 0 :(得分:0)

您机器上安装了哪个版本的MSIE?如果您使用的是9.0 beta版,则可能会出现问题,因为它使用硬件加速接口D2D / DWrite来呈现页面。

但我非常怀疑你传递给函数的窗口句柄,不是呈现内容的窗口。通常我会使用以下代码捕获网页内容。

function TWebBrowserDescent.GetThumbnail: TBitmap;
var
  VOPtr: IViewObject;
  R: TRect;
begin
  Result := TBitmap.Create;
  if Supports(Document, IViewObject, VOPtr) then
  begin
    Result.Width  := ClientWidth;
    Result.Height := ClientHeight;
    R := Result.Canvas.ClipRect;
    try
      VOPtr.Draw(DVASPECT_DOCPRINT, 0, nil, nil, 0, Result.Canvas.Handle, @R, nil, nil, 0);
    except
    end;
  end;
end;

使用该代码,您可以捕获浏览器的可见部分(视口)。它应该能够捕获嵌入式ActiveX控件。下一步,您可以将浏览器滚动到特定位置,以使整个Flash可见。

如果其他网页使用代码但只有您的问题页面可以使用它,我认为ActiveX控件没有实现 IViewObject 接口。

我希望答案可以帮助你。