c# - 我如何防止使用 C# 进行屏幕录制

标签 c#

我解密后在媒体播放器中显示视频,我想将其保存并防止任何程序打印屏幕和屏幕录制。

最佳答案

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

几年前我问过类似的问题。您可以使用 SetwindowDisplayAffinity 阻止应用程序窗口的屏幕截图:How 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 完美地工作(在爱丽丝和鲍勃类比中,鲍勃(预期的接收者)和查理(试图拦截content)是同一个人),所以要小心不要在这上面投入太多时间。

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

更新:

Raymond Chen 的博客中有一条评论警告说,另一个进程(带有另一个进程窗口的 hWnd)可以简单地调用 SetWindowDisplayAffinity( otherProcessesWindowHandle, WDA_NONE ); 来移除 DisplayAffinity 保护。我不知道它是否有效,我想请您尝试一下,让我们知道是否有其他进程可以那样打败它。

关于c# - 我如何防止使用 C# 进行屏幕录制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42351709/

相关文章:

具有透明区域的 C# PNG 图像作为按钮

c# - 在 Itextsharp 中使用 ITextExtractionStrategy 和 LocationTextExtractionStrategy 获取字符串坐标

c# - 如何在 C# 中获取 Json 数组?

c# - 将动态对象应用于 Storyboard

c# - WPF MVVM 根据焦点项目执行不同的操作

c# - 从 C# 克隆 Mercurial 存储库?

c# - LINQ 等效于 std::partition

c# - UWP - 未找到包含提供的指纹的证书

c# - 使用 C# 在分解后删除 AutoCAD 绘图对象

c# - 自定义 Web api 帮助页面以删除请求格式