对于捕获活动窗口的屏幕截图,我在Delphi中使用源代码Capture the Screen Shot of the Active Window和此代码:
procedure ScreenShot(activeWindow: bool; destBitmap : TBitmap) ;
var
w,h : integer;
DC : HDC;
hWin : Cardinal;
r : TRect;
begin
if activeWindow then
begin
hWin := GetForegroundWindow;
dc := GetWindowDC(hWin) ;
GetWindowRect(hWin,r) ;
w := r.Right - r.Left;
h := r.Bottom - r.Top;
end
else
begin
hWin := GetDesktopWindow;
dc := GetDC(hWin) ;
w := GetDeviceCaps (DC, HORZRES) ;
h := GetDeviceCaps (DC, VERTRES) ;
end;
try
destBitmap.Width := w;
destBitmap.Height := h;
BitBlt(destBitmap.Canvas.Handle,
0,
0,
destBitmap.Width,
destBitmap.Height,
DC,
0,
0,
SRCCOPY) ;
finally
ReleaseDC(hWin, DC) ;
end;
end;
Usage:
var
b:TBitmap;
begin
b := TBitmap.Create;
try
ScreenShot(TRUE, b) ;
Image1.Picture.Bitmap.Assign(b) ;
finally
b.FreeImage;
FreeAndNil(b) ;
end;
如何转换它以截取受保护的有源软件(如Oxynger KeyShield?
)的屏幕截图答案 0 :(得分:1)
Windows 7及更高版本上的Windows显示管理器(WDM)支持SetWindowDisplayAffinity,其标志为WDA_MONITOR,可防止使用任何类型的屏幕截图捕获窗口图像。
它阻止的API调用存在限制,它仅适用于DWM合成窗口。请参阅我的回答here以获取其使用示例和更多信息,或者查看我上面链接的MSDN文档。
如果这是KeyShield使用的技术来保护窗口不被捕获,那么你必须找出哪些不的API被SetWindowDisplayAffinity阻止,带有WDA_MONITOR标志并且看到如果你可以使用其中一个来绕过限制。虽然它是操作系统功能的一部分,所以我想,未覆盖的API列表将会相当短。