【发布时间】:2018-07-14 20:33:18
【问题描述】:
我想捕获一个桌面图像,该图像在捕获时会忽略我的表单。我喜欢this answer,但是一直无法截取桌面内容,只能黑屏。
所以,我需要帮助来解决这个问题。
这是我的版本,改动不大:
private
{ Private declarations }
DesktopBMP: TBitmap;
procedure WMEraseBkgnd( var Message: TWMEraseBkgnd ); message WM_ERASEBKGND;
public
{ Public declarations }
protected
procedure Paint; override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
DesktopBMP := TBitmap.Create;
DesktopBMP.SetSize( Screen.Width, Screen.Height );
DoubleBuffered := True;
end;
procedure TForm1.tmr1Timer(Sender: TObject);
begin
Width := 0;
Height := 0;
Width := Screen.Width;
Height := Screen.Height;
end;
procedure TForm1.Paint;
begin
inherited;
//Canvas.Draw( 0, 0, DesktopBMP );
DesktopBMP.SaveToFile('c:\tela.bmp');
end;
procedure TForm1.WMEraseBkgnd( var Message: TWMEraseBkgnd );
var
DesktopDC: HDC;
DesktopHwnd: Hwnd;
DesktopCanvas: TCanvas;
begin
DesktopHwnd := GetDesktopWindow;
DesktopDC := GetDC( DesktopHwnd );
try
DesktopCanvas := TCanvas.Create;
DesktopCanvas.Handle := DesktopDC;
DesktopBMP.Canvas.CopyRect( Rect( 0, 0, Screen.Width, Screen.Height ), DesktopCanvas, Rect( 0, 0, Screen.Width, Screen.Height ) );
finally
DesktopCanvas.Free;
ReleaseDc( DesktopHwnd, DesktopDC );
end;
Message.Result := 1;
inherited;
end;
【问题讨论】:
-
@TomBrunberg,那么是不是可以擦除 Form 上的这个黑屏? WM_ERASEBKGND 工作正常,但是会生成黑屏(在窗体的背景上)并且看不到桌面的屏幕截图。
-
@TomBrunberg,我的目标是在全屏表单后面看到(已经制作),但这里的问题是,表单的背景不是保持干净,而是生成黑色,这显示在如您在上面看到的屏幕截图。现在我想知道是否有可能删除屏幕截图结果中显示的表单上的这个黑色部分(不再隐藏和显示表单)?
-
你告诉 Windows 你已经用
Message.Result := 1;擦除了背景,但是你的代码除了将桌面画布复制到你的 bmp 之外没有做任何事情。如果你注释掉那行会发生什么? -
@nil,
What happens if you comment out that line?。什么都没有。 -
图片出现黑屏的原因可能/很可能是
OnTimer:Width := 0; Width := Screen.Width;中的代码(高度也一样)。要确认,请将设置注释为 0。这可能只会给您一个屏幕截图,这不是最终解决方案,但它会确认问题。然后,您将需要找到另一种触发更新屏幕截图的方法。顺便说一句,在表单的每个绘制事件中保存文件似乎不是一个好主意。
标签: delphi screenshot fullscreen vcl