对于完整的屏幕截图,我使用以下代码:
form1.Hide;
sleep(500);
bmp := TBitmap.Create;
bmp.Height := Screen.Height;
bmp.Width := Screen.Width;
DCDesk := GetWindowDC(GetDesktopWindow);
BitBlt(bmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, DCDesk, 0, 0, SRCCOPY);
form1.Show ;
FileName := 'Screenshot_'+FormatDateTime('mm-dd-yyyy-hhnnss',now());
bmp.SaveToFile(Format('C:Screenshots%s.bmp', [FileName]));
ReleaseDC(GetDesktopWindow, DCDesk);
bmp.Free;
我如何将其转换为只拍摄活动窗口的屏幕截图。
8条答案
按热度按时间amrnrhlw1#
1.首先,你必须找到合适的窗口。正如锐齿已经注意到的,您应该使用
GetForegroundWindow
而不是GetDesktopWindow
。你在你的improved version中做得很正确。1.但之后您必须将位图大小调整为DC/窗口的实际大小。你还没有做到这一点。
1.然后确保你没有捕捉到一些全屏窗口!
当我执行你的代码时,我的Delphi IDE被捕获了,因为它默认是全屏的,所以它创造了全屏截图的错觉。(即使您的代码基本上是正确的)
考虑到上面的步骤,我成功地使用您的代码创建了一个单窗口屏幕截图。
只需提示:如果您只对工作区感兴趣,则可以使用
GetDC
而不是GetWindowDC
。(无窗口边框)**编辑:**以下是我对您的代码的处理:
您不应使用此代码!看看下面的改进版本。
**编辑2:**按照要求,我正在添加更好版本的代码,但我会保留旧版本作为参考。您应该认真考虑使用此代码,而不是您的原始代码。在出现错误的情况下,它的表现会好得多。(资源已清除,您的表单将再次可见,...)
f1tvaqid2#
您的代码可以简单得多。当您决定要保存哪个表单时,尝试使用我使用的代码:
rsaldnfx3#
这结合了到目前为止描述的所有方法。它还可以处理多显示器场景。
传入您想要的屏幕截图和TJpegImage,它会将您所请求的屏幕截图分配给该图像。
bgibtngc4#
JCL再次出手相救..
cqoc49vn5#
谢谢你的这个有用的提交,我想我可能会把提供的代码放在一个单元中,以便在我的应用程序中使用,这里是我在DX10.2东京运行的代码。请注意示例,注意内存泄漏。
示例:
g52tjvyc6#
使用GetForegoundWindow()而不是GetDesktopWindow()。
您必须保存GetForegoundWindow()返回的句柄,并将保存的值传递给ReleaseDC(),以确保为同一窗口调用GetWindowDC()和ReleaseDC(),以防活动窗口在两次调用之间发生变化。
e1xvtsh37#
如果任何人正在寻找更跨平台的解决方案,这个解决方案声称支持Windows和MacOS-X:https://github.com/z505/screenshot-delphi
utugiqy68#
布莱恩·弗罗斯特代码的最短版本如下:
Screen.ActiveForm.GetFormImage.SaveToFile(Screen.ActiveForm.Caption+'.bmp');
只有一行代码(MDI应用程序中活动窗口的屏幕截图)。