禁用我的Swing Window的屏幕截图

我有一个Swing窗口,其中包含敏感信息,我想阻止用户截取屏幕截图,或者当他们截取屏幕截图时窗口隐藏。

我怎样才能做到这一点?

我过去看到的一个聪明的方法是通过一次只显示一部分图像来利用人类的持久视觉 。

举一个简单的例子,假设您没有在文本框中呈现密码“p455w0rd”,而是使用了一个特殊的文本框,可以非常快速地呈现三个不同的框架:

  1. p ␣ ␣ 5 ␣ ␣ r ␣
  2. ␣ 4 ␣ ␣ w ␣ ␣ d
  3. ␣ ␣ 5 ␣ ␣ 0 ␣ ␣

任何屏幕截图都只捕获数据的一部分(1/3),并且需要捕获器获取许多屏幕截图,选择包含所有信息的三个屏幕截图,然后将它们组合在一个图像编辑器中以恢复数据。

更好的解决方案是使用更多帧(尽管随着帧数增加闪烁会增加)或更精细的粒度(例如,像素而不是字符)。

但请记住,这种解决方案只会使存储数据变得更加困难。 您将很难阻止用户掏出笔或相机。 除非这是针对试图保护客户数据的某些政府或呼叫中心应用程序,否则我会认真考虑不添加此类function。

如果有人试图这样做,我会在VM中运行他们的程序,然后截取VM屏幕截图。

所以你无法阻止这样的事情……你为什么要这样做?

Ubnfortunatly,你将无法以有效的方式这样做。

首先,操作系统在拍摄截图时可能不会发送事件(这可能会给你一个句柄 – 或者一个事件)。

Sceond,用户可以随时在VM中运行您的应用程序(防止发送通风口),或者更糟,更容易,使用可拍照手机或任何其他设备拍照。

最后,显示用户可以看到但不记忆的信息的重点是什么? 如果您希望隐藏您的信息,请不要向用户显示,否则他将始终能够复制它们(例如,考虑娱乐行业和DVD筛选器的问题)。

最后,如果您想给老板一些积极的信息,请查看jintellitype ,它将允许您为“打印屏幕”键注册一个监听器。

我知道如何做到这一点。 我从来没有这样做过。 但我今天肯定会尝试这一点。

  1. 显示窗口时,将剪贴板中的所有数据保存到某个变量中。 (这并不像听起来那么容易。)我不确定这是否可取。 如果您在实施之前联系您的系统管理员会更好。
  2. 捕获KeyEvent 。 如果按下的键是VK_PRINTSCREEN ,请清除系统剪贴板。 (如果您尚未实施第1步,则会导致剪贴板上的所有数据丢失。)
  3. 退出应用程序之前,将已保存的所有数据传输到剪贴板。

以下是一些可以帮助您的网站。

http://www.javaworld.com/javaworld/javatips/jw-javatip61.html?page=1 http://www.java2s.com/Code/Java/Development-Class/CommunicwithwithSystemClipboard.htm

将任何字符串保存到系统剪贴板。 屏幕截图将被删除。

 public void handleKey(KeyEvent ke) { switch(ke.getCode()) { case PRINTSCREEN : System.out.println("print screen"); StringSelection ss = new StringSelection("??????"); Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null); break; default: //System.out.println(ke.getCode()); } ke.consume(); }