【问题标题】:How can I know if the user has made a screenshot?我怎么知道用户是否做了截图?
【发布时间】:2012-01-14 11:49:53
【问题描述】:

我正在编写一个小型 c# 程序,我不希望最终用户在使用我的程序时截屏,这可能吗?或者就算他拿了一个,我怎么知道呢?

由于我缺乏 c# 编码经验,如果这是一个内容不佳的问题,请提前致谢。

【问题讨论】:

  • ...如果他使用相机?
  • 即使有,我不知道有什么可以做到这一点,他们仍然可以拍摄屏幕照片:)
  • 这看起来很难预防(尤其是如果用户足够持久)...
  • 除非您是对用户实施策略的系统管理员,否则您不应该这样做。
  • 您要解决什么问题?为什么需要阻止人们截屏?如果数据适合展示,就适合拍照。这是不可能的;改变你的要求。

标签: c# screenshot


【解决方案1】:

您可以使用低级键盘过滤器创建系统范围的键盘挂钩并取消任何打印屏幕键盘组合。但是,如果有人还安装了帮助应用程序(例如 Gadwin 或其他什么),这将变得更加困难,因为您不会事先知道应该使用哪个键盘快捷键(大多数工具都允许指定您自己的挂钩)。

附带说明:通常不希望更改系统行为。屏幕截图是系统行为,用于故障排除。如果您阻止这种情况,用户将无法向您显示错误的屏幕截图。但如果你必须这样做,你可以做到。


编辑:在更深层次上,您可以install an API hook。所有屏幕截图应用程序都使用 API 调用来获取屏幕(部分)的内容。但是 API 钩子很难做到正确。一种更简单的方法可能是编写用户级驱动程序。虽然您可以阻止这一切,但真的值得所有的麻烦吗?

【讨论】:

  • 不适用于虚拟机、物理相机和许多其他选项。这是浪费时间。
  • 感谢您的回答,我会尽快查看这些选项!如果用户正在从虚拟机中截屏,这种方法会阻止他拍摄 SS 吗?或者我可以检测到他吗?
  • 即使是用户模式的 API 挂钩也可以通过直接调用内核来绕过。
  • 这就是我写“真的值得所有麻烦吗?”的原因。但我不为应用程序编写规范。市场上有一些屏幕无法拍照。所以我想这种东西有市场(但真的,我不知道为什么)。如果一切都失败了,黑客总会想办法绕过它,比如读取图形卡的内存。
  • 对系统所有者造成此类困难的应用程序称为恶意软件。
【解决方案2】:

您可能需要keyboard hook。但它会告诉您用户是否按下了“打印屏幕”键,而不是有人使用某些 GDI 功能以编程方式截取屏幕截图。

我怀疑是否有可能阻止所有截屏的方式。

【讨论】:

  • Windows 7 截图工具将难以避免。
  • @sshow:不是真的。这是一个可执行文件,阻止可执行文件运行几乎是微不足道的。此外,如果您想要安装 Windows 的信息亭,Microsoft 会通过阻止大多数系统应用程序(包括 Snipping Tool)运行来满足此要求。
【解决方案3】:

一般回答:不。无法检测到这一点 - 尤其是从 C# 中。截图的方法有很多种,甚至用 C++/WinAPI 编写的应用程序也只能检测到其中的一部分,而不是全部。

还要考虑 - 如果用户在虚拟机中运行您的应用怎么办?他将能够在主机上截取屏幕截图,而您完全无法检测(甚至阻止)这一点。

【讨论】:

  • 大多数情况下很容易检测出来。除了非托管应用程序(如驱动程序)外,任何可以用 C++ 编写的东西都可以用 C# 编写。 WinAPI 可以在 C# 中通过 P/Invoke 使用:pinvoke.net。为虚拟机 +1 ;)
  • P/Invoke 是我在我的程序中尽量避免的事情 :) 无论如何,您如何检测一个简单的 GDI 软件正在执行 GetDC(0) + 从该上下文中检索图像?如果我需要类似的东西,我可以在 30 分钟内写一篇……
  • 使用 API 挂钩。结果很可能是你的程序崩溃了。我不建议编写这样的软件,但 OP 可能会问这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多