检测用户截取我的程序的截图

我在写一个Windows应用程序。 我怎样才能知道截图正在被采取? 我读了关于如何检测被按下的热键,但我更担心的情况是每100毫秒左右的另一个程序正在截图。 也就是说,我试图注意到有人创build了另一个程序(比如另一篇文章中提到的使用ImageGrab的python),该程序会不断地截取我的应用程序并使用它们来读取信息。

我不太在意阻止截图被采取 – 我可以禁止用户一旦发现这种行为。

这可能吗? 是否有任何应用程序截图时发送Windows消息,如使用WM_HOTKEY? 或者窗户只是使用最新的绘画事件的最新信息,并直接返回到其他程序,没有我的应用程序能够注意到呢?

Solutions Collecting From Web of "检测用户截取我的程序的截图"

无论你做什么,人们都会找到解决办法。 假设存在这样的方法,那么您可以可靠地检测另一个程序,并截取您的应用程序的屏幕截图。 为了解决这个问题,我可以安装VirtualBox,在虚拟机中运行你的应用程序,然后让一个程序获得VirtualBox的屏幕截图(然后包含你的应用程序)。 你的应用程序将无法知道它正在拍摄照片。

如果我使用摄像机怎么办? 如果我捕捉到电脑和显示器之间的视频怎么办?

我会惊讶地发现,有任何可行的方法来做到这一点。

这是永远不会工作。 不仅如此,但是提供这种安全级别的尝试将给您的合法用户的99%带来不便。

您可能最好从试图确定您的信息的不需要的用途/副本的角度来处理这个问题,并且接近使用这些信息的人员/公司。

版权法适用于这种方法,但是我明白在这种方法不可用的地方有一些实例。

首先,关于使用虚拟机的评论是毫无意义的 – 检测虚拟器下运行的窗口要比检测正在执行的截图容易得多。

制作屏幕截图很困难的一个好方法是重写程序,使其在全屏幕模式下在某个祖先的dos扩展器下​​运行。

禁止95%尝试截图的用户的一个好方法是在启动时显示一个巨大的闪烁横幅(“禁止截图!你被禁止!”),并在接下来的15秒内检测到用户按下PrtScrn。

你可以(不可靠)通过使用SetWindowsHookEx来做到这一点。

这是一个完整的VB.NET示例。

但是,有很多方法可以解决这个问题。 在你之后安装一个钩子将会“覆盖”你的钩子。 用户可以以多种方式拍摄他们的屏幕,如本主题中所述。 我会尝试考虑其他的保护措施。

完全阻止它是相当困难的…一个足够坚决的用户可以用数码相机拍摄屏幕照片。

另一个原因,我认为这是不可能的:

很久以前,我没能对Windows Media Player的内容进行屏幕截图,因为(我假设)WMP立即将该内容流式传输到视频卡上。 (有趣的细节:在粘贴屏幕截图后,视频将继续在MS Paint中播放,但保存图像最终会产生黑色方块)。 无论如何,使用VNC很容易获得屏幕截图。

我通常采用截图(从C#)的方式是调用BitBlt,这是很多屏幕绘制的基础。 不知道如何以任何有意义的方式拦截对它的调用,因为系统上的每个程序可能都在低级别使用它。

我假设你真的不能这样做,因为人们总是可以在虚拟机的窗口中运行你的程序,然后在外部平​​台上使用捕获程序,并知道这是否是件很难的事情。 我建议更多地考虑特殊渲染速度或交错,特殊对比等方式。

您也可以将输出运行到屏幕上,就像它是一部电影一样,使用低码率和分辨率编码器对其进行编码,以便每100ms捕捉一次仍然无用的质量。 (你有没有冻结低质量的电影?)

但是,您真的应该考虑使用其他方式来保护您的信息。

有一种方法,我认为可以阻止它。 例如,了解复制时模糊图形显示的技术。

截图,从虚拟操作系统的数码相机截图拍摄。

玩它,谁知道你可能会发明的东西,将使数百万美元。