我正在制作一个可以在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
答案 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
接口。
我希望答案可以帮助你。