检测用户何时截取我的程序的屏幕截图

时间:2009-04-21 22:25:42

标签: windows security screenshot

我正在编写Windows应用程序。如何判断屏幕截图是什么时候?我读到了如何检测被按下的热键,但是我更担心每100毫秒左右另一个程序正在截取它的截图。也就是说,我试图注意到有人创建另一个程序(比如使用ImageGrab的python,如另一篇文章中提到的),它不断截取我的应用程序的截图并使用它们来读取它的信息。

我不太关心阻止屏幕截图被采取 - 一旦发现这种行为,我就可以禁止用户。

这可能吗?当任何应用程序截取屏幕截图时是否会发送Windows消息,例如WM_HOTKEY?或者Windows是否仅使用最新绘制事件中的最新信息,并将其直接返回到其他程序,而我的应用程序根本无法注意到?

10 个答案:

答案 0 :(得分:28)

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

答案 1 :(得分:7)

如果我使用摄像机怎么办?如果我捕获计算机和显示器之间的视频怎么办?

我会惊讶地发现有任何实用的方法可以做到这一点。

答案 2 :(得分:7)

这永远无法奏效。不仅如此,但提供此级别安全性的尝试将使99%的合法用户感到不便。

您最好从尝试识别信息的不需要的使用/副本以及使用该信息接近人/公司的角度来解决问题。

版权法适用于这种方法,但据我所知,有些方法无法使用此方法。

答案 3 :(得分:4)

您可以(不可靠)使用SetWindowsHookEx执行此操作。

Here is a complete VB.NET example.

然而,有很多方法可以解决这个问题。你的安装后的钩子将“覆盖”你的钩子。用户可以通过多种方式拍摄屏幕图片,如本主题所述。我会尝试考虑其他保护选项。

答案 4 :(得分:3)

首先,关于使用虚拟机的评论完全没有意义 - 检测在虚拟器下运行的窗口比检测正在拍摄的屏幕截图要容易得多。

让屏幕截图变得困难的好方法是将程序重写为在一些祖先的dos扩展器下​​以全屏模式运行。

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

答案 5 :(得分:2)

很难完全阻止它......一个足够坚定的用户可以用数码相机拍摄一张照片。

答案 6 :(得分:2)

我认为实现这一目标的另一个原因是:

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

我认为你真的不能,因为一个人总是可以在一个带有虚拟机的窗口中运行你的程序,然后在外部平​​台上使用一个捕获程序,并且知道这是否是非常困难的。我建议更多地考虑特殊渲染速度或隔行扫描,特殊对比等......

您还可以将输出运行到屏幕,就好像它是一部电影一样,使用低速率和分辨率编码器对其进行编码,这样每100毫秒仍然可以捕获的质量如此之低,以至于它毫无价值。 (你有没有冻过低质量的电影?)

但是你真的应该考虑使用其他方法来保护你的信息。

答案 9 :(得分:-1)

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

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

玩它,谁知道你可能会发明一些会使你成千上万的东西。