PrintWindow()WebBrowser返回一个黑色图像

本文关键字:一个 黑色 图像 返回 WebBrowser PrintWindow | 更新日期: 2023-09-27 18:01:08

我正在制作一个应用程序,该应用程序将在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的黑屏图片。https://i.stack.imgur.com/K8569.jpg这是图片的外观(使用Alt+PrintScreen拍摄(。https://i.stack.imgur.com/FtclU.jpg这是其他游戏的图片,可以用PrintWindow拍摄。https://i.stack.imgur.com/7luSZ.jpg

PrintWindow()WebBrowser返回一个黑色图像

您的机器上安装了哪个版本的MSIE?如果您使用的是9.0测试版,它可能会出现问题,因为它使用硬件加速接口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接口

我希望答案能对你有所帮助。