如何使用C#阻止屏幕录制

时间:2017-02-20 18:19:34

标签: c#

我解密后在媒体播放器中显示视频,我希望将其保存到整个屏幕并阻止任何程序进行打印屏幕和屏幕录制。

1 个答案:

答案 0 :(得分:6)

Office 2013及更高版本尝试阻止Office应用程序窗口的屏幕截图,如果它们当前打开了IRM文档。截取屏幕截图时,您会得到一个黑色矩形而不是窗口内容。

几年前我问了一个类似的问题。您可以使用SetwindowDisplayAffinityHow does Office 2013 implement black windows for IRM?

阻止应用程序窗口的屏幕截图
HWND myWindowWindowHandle = ...
BOOL ok = SetWindowDisplayAffinity( myWindowWindowHandle, WDA_MONITOR );
if( !ok ) exit(1);
ShowWindow( myWindowWindowHandle, SW_NORMAL );

这需要Windows 7或更高版本,系统必须在启用DWM的情况下运行(DWM始终在Windows 8或更高版本上运行)。

Raymond Chen也在这里写了博客:https://blogs.msdn.microsoft.com/oldnewthing/20130603-00/?p=4193

在过去(在Windows中的DWM之前),视频通常使用图形卡中的视频叠加功能显示,其中压缩视频将被输入GPU并进行解码,而不会被发送回系统RAM(而是特殊颜色)用于定义视频将被覆盖的屏幕上的像素:https://en.wikipedia.org/wiki/Video_overlay,这就是为什么之前无法截取屏幕截图的原因:它不是DRM,只是性能优化的副作用)

请注意,DRM完全可以数学上不可能(在 Alice和Bob 类比中,Bob(预期收件人)和Charlie(有人试图拦截内容)是同一个人),所以要小心投入太多时间。

请注意,SetWindowDisplayAffinity并未停止所有屏幕录制工具,例如最近的GPU内置支持硬件加速显示输出捕获(我相信这就是 Windows Game DVR uses)可能不受WDA_MONITOR的影响。用户还可以在虚拟机环境中运行您的软件,或者修改Windows以禁用DWM(在Windows 7上很容易,但在Windows 8和10上仍然很难)。

更新:

Raymond Chen的博客中有一条评论警告说,另一个进程(使用hWnd另一个进程'窗口)可以简单地调用SetWindowDisplayAffinity( otherProcessesWindowHandle, WDA_NONE );来删除DisplayAffinity保护。我不知道它是否会起作用,我想请你尝试一下,让我们知道另一个过程是否会以这种方式打败它。