7

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

我不太关心阻止截屏 - 一旦注意到这种行为,我就可以禁止用户。

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

4

10 回答 10

31

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

于 2009-04-21T22:31:14.220 回答
7

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

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

于 2009-04-21T22:29:15.440 回答
7

这永远行不通。不仅如此,提供这种安全级别的尝试也会给 99% 的合法用户带来不便。

您可能最好从尝试识别您的信息的不需要的用途/副本的角度来解决问题,并与使用该信息的人/公司联系。

版权法适用于这种方法,但我知道在某些情况下这种方法不可用。

于 2009-04-21T22:42:02.713 回答
4

您可以(不可靠地)使用SetWindowsHookEx来做到这一点。

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

但是,有很多方法可以解决这个问题。在你之后安装的钩子将“覆盖”你的钩子。用户可以通过多种方式为他们的屏幕拍照,如本主题所述。我会尝试考虑除此之外的其他保护选项。

于 2009-04-22T00:24:50.407 回答
3

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

使屏幕截图变得困难的一个好方法是重写您的程序以在某些祖先的 dos 扩展程序下以全屏模式运行。

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

于 2009-04-21T22:55:34.880 回答
2

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

于 2009-04-21T22:30:25.297 回答
2

我认为不可能实现这一目标的另一个原因:

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

于 2009-04-21T22:57:46.747 回答
1

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

于 2009-04-21T22:30:05.377 回答
1

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

您还可以将输出像电影一样运行到屏幕上,使用低速率和分辨率的编码器对其进行编码,这样每 100 毫秒的静态捕获质量就会非常低,以至于毫无价值。(你有没有冻结一部低质量的电影?)

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

于 2009-04-21T22:34:19.907 回答
-1

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

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

玩它,谁知道你可能会发明一些能让你赚上百万的东西。

于 2009-06-06T02:37:17.753 回答