如何在Delphi中截取受保护的活动窗口的屏幕截图?

时间:2014-03-30 12:39:55

标签: delphi screenshot

对于捕获活动窗口的屏幕截图,我在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

)的屏幕截图

1 个答案:

答案 0 :(得分:1)

Windows 7及更高版本上的Windows显示管理器(WDM)支持SetWindowDisplayAffinity,其标志为WDA_MONITOR,可防止使用任何类型的屏幕截图捕获窗口图像。

它阻止的API调用存在限制,它仅适用于DWM合成窗口。请参阅我的回答here以获取其使用示例和更多信息,或者查看我上面链接的MSDN文档。

如果这是KeyShield使用的技术来保护窗口不被捕获,那么你必须找出哪些的API被SetWindowDisplayAffinity阻止,带有WDA_MONITOR标志并且看到如果你可以使用其中一个来绕过限制。虽然它是操作系统功能的一部分,所以我想,未覆盖的API列表将会相当短。