Отключить скриншот моего окна Swing - PullRequest
2 голосов
/ 06 сентября 2010

У меня есть окно Swing, содержащее конфиденциальную информацию, и я бы хотел, чтобы пользователи не делали скриншоты или делали их невидимыми, когда они делают скриншоты.

Как этого добиться?

Ответы [ 5 ]

9 голосов
/ 06 сентября 2010

Один умный подход, который я видел в прошлом, использует стойкость зрения человека , отображая только часть изображения за один раз.

В качестве простого примера представьте, что вместо рендеринга пароля 'p455w0rd' в текстовом поле у ​​вас было специальное текстовое поле, которое очень быстро отображает три разных фрейма:

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

Любой снимок экрана будет захватывать только часть (1/3) данных и потребовать, чтобы средство захвата сделало много снимков экрана, выберите три, которые охватывают всю информацию, а затем объедините их в редакторе изображений для восстановления данных. 1018 *

Лучшее решение будет использовать больше кадров (хотя мерцание будет увеличиваться с увеличением количества кадров) или более высокую степень детализации (скажем, пикселей вместо символов).

Помните, однако, что это решение только усложняет, а не делает невозможным хранение данных. Вам было бы трудно остановить пользователя, вынимающего ручку или камеру. Если только это не относится к какому-либо правительственному приложению или приложению центра обработки вызовов, которое пытается защитить данные клиентов, я бы серьезно не стал добавлять такую ​​функцию.

7 голосов
/ 06 сентября 2010

Если бы кто-то попытался сделать это, я запустил бы их программу на виртуальной машине, а затем сделал бы снимок экрана с виртуальной машиной.

Таким образом, вы не можете предотвратить что-то подобное ... и зачем вам это?

2 голосов
/ 06 сентября 2010

К сожалению, вы не сможете сделать это эффективно.

Во-первых, операционная система, кажется, не отправляет событие, когда они делают скриншоты (которые могли бы дать вам дескриптор - или событие).

Sceond, пользователь всегда может запустить ваше приложение на виртуальной машине (предотвращая отправку вентиляционного отверстия) или, что еще хуже и проще, сделать снимок с помощью камеры или любого другого устройства.

Наконец, какой смысл показывать информацию, которую пользователь может видеть, но не запоминать? Если вы хотите, чтобы ваши данные были скрыты, не показывайте их пользователю, в противном случае он всегда сможет их скопировать (например, подумайте об индустрии развлечений и проблемах с DVD-панелями).

Наконец, если вы хотите дать своему боссу некоторую положительную информацию, взгляните на jintellitype , который позволит вам зарегистрировать слушателя для клавиши «Печать экрана».

1 голос
/ 03 февраля 2012

У меня есть представление о том, как это можно сделать. Я никогда этого не делал. Но я обязательно попробую это сегодня.

  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/CommunicatingwiththeSystemClipboard.htm

0 голосов
/ 27 апреля 2018

сохранить любую строку в системный буфер обмена.снимок экрана будет удален.

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();
}
...