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

如何在Delphi中拍摄受保护活动窗口的屏幕截图?,delphi,screenshot,Delphi,Screenshot,为了捕获活动窗口的屏幕截图,我在Delphi中使用了一个包含以下代码的源代码: procedure ScreenShot(activeWindow: bool; destBitmap : TBitmap) ; var w,h : integer; DC : HDC; hWin : Cardinal; r : TRect; begin if activeWindow then begin hWin := GetForegroundW

为了捕获活动窗口的屏幕截图,我在Delphi中使用了一个包含以下代码的源代码:

 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;

如何将其转换为拍摄受保护的活动软件的屏幕截图,如?

Windows 7及更高版本上的Windows显示管理器(WDM)支持带标志的WDA_监视器,以防止使用任何类型的屏幕截图捕获窗口图像

API调用有限制,它会阻塞,并且只在DWM复合窗口上工作。请参阅我的答案以了解其使用示例和更多信息,或者参阅我上面链接的MSDN文档


如果这是KeyShield用来保护窗口不被捕获的技术,那么您必须找出哪些API未被SetWindowDisplayAffinity通过WDA_监视器标志阻止,并查看是否可以使用其中一个来绕过限制。不过,这是操作系统功能的一部分,因此我认为未覆盖API的列表将相当短。

我不知道该软件如何执行其预防功能,但“fraps”可以试一试。不是键盘而是桌面,但这是你的屏幕保护。。。您必须在fraps中检查“monitor dwm”,Oxinger需要“桌面合成”。您是否询问过KeyShield软件的供应商如何做到这一点?@David-该应用程序的目的是防止被捕获。我怀疑他们会帮忙。@Sertac这正是我的观点!!这个答案提出的一个明显的问题是,“为什么不在OP想要捕获的窗口上使用
SetWindowDisplayAffinity
,以删除其显示相关性限制?”。您引用的文档或您发布的链接没有提到为什么不能使用它来恢复亲缘关系。@Sertac:我认为这并不容易,因为“此功能使应用程序能够保护自己的屏幕窗口内容,使其不会通过一组特定的公共操作系统功能和API被捕获或复制。”,在此之前,它说“支持窗口内容保护功能”-如果它可以被另一个应用程序删除,那么它似乎不是一个很好的保护系统。@SertacAkyuz,我发现设置/取消设置这些内容需要什么线程注入,因为这个函数拒绝与另一个进程拥有的窗口一起工作。