我需要防止打印屏幕按钮制作屏幕截图。并通过第三方软件。
我决定使用全屏,以便他们无法使用第三方软件制作屏幕截图。
,但我仍然不知道如何防止屏幕截图。
ps。该应用程序与违规行为有关。我不希望我的大量电子书免费共享。我想到了视频等,但是写作更多是我的做法。
以这种方式,他们唯一的复制方法是用高清摄像头制作照片。
有人知道是否可能吗?我什么都没找到。
简单地回答:您不能。
创建屏幕截图通常是基础操作系统的功能。运行在操作系统之上的Java应用程序不能限制在该操作系统上运行的其他过程。或限制该操作系统提供的功能。即使您可以 - 没有什么可以阻止人们在虚拟机中运行操作系统,然后从运行VM的 host 屏幕截图。
除此之外:创建屏幕截图是一项无价的功能。您知道,也许有人想创建一些申请的屏幕截图,以记录其对他的同事的使用情况。或者有人想在这里或那里进行屏幕截图,以便自己记录某些方面。现在您来宣布:"对不起,根本没有屏幕截图"。这具有将用户拒之门外的一定潜力。没有什么比说服您的用户有关您的产品带有不良用户体验的更糟糕的了。
从这个意义上讲,您的问题没有良好的技术解决方案。相反:很可能您将不得不花费大量努力才能使任何工作中途有效(如:在VM设置中,您可以完全做 nothing )。取而代之的是,我将以合理的成本将资源用于创造出色的用户体验。不要将精力集中在限制用户上。
您无法预防它,但是您可以在一定程度上尝试覆盖它。
该想法检测到按下打印屏幕,隐藏要隐藏的内容,并调用另一个打印屏幕,覆盖上一个屏幕。
这不是强大的,当然有局限性,并且可以被限制,但可以为您提供基本的控制。
此swing
基本演示在我的Windows机器上进行了测试:
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Robot;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class NoPrintScreen extends JFrame{
public final String RED_PAGE = "red page";
public final String WHITE_PAGE = "white page";
private CardLayout cLayout;
private JPanel mainPane;
boolean isRedPaneVisible = false;
public NoPrintScreen(){
setTitle("No Print Screen");
setSize(400,250);
setDefaultCloseOperation(EXIT_ON_CLOSE);
addKeyListener(new MyKeyListener());
setFocusable(true);
mainPane = new JPanel();
cLayout = new CardLayout();
mainPane.setLayout(cLayout);
JPanel whitePane = new JPanel();
whitePane.setBackground(Color.WHITE);
whitePane.add(new JLabel("Hit Prtint Screen and check resuts"));
JPanel redPane = new JPanel();
redPane.setBackground(Color.RED);
redPane.add(new JLabel("Print Screen is discouraged"));
mainPane.add(WHITE_PAGE, whitePane);
mainPane.add(RED_PAGE, redPane);
add(mainPane,BorderLayout.CENTER);
switchPanes();
setVisible(true);
}
void switchPanes() {
if (isRedPaneVisible) {showRedPane();}
else { showWhitePane();}
}
void showWhitePane() {
cLayout.show(mainPane, WHITE_PAGE);
isRedPaneVisible = true;
}
void showRedPane() {
cLayout.show(mainPane, RED_PAGE);
isRedPaneVisible = false;
}
public static void main(String[] args) {
new NoPrintScreen();
}
class MyKeyListener extends KeyAdapter {
@Override
public void keyReleased(KeyEvent e) {
if(KeyEvent.VK_PRINTSCREEN== e.getKeyCode()) {
switchPanes();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
final Robot robot = new Robot(); //invoke new print screen
robot.keyPress(KeyEvent.VK_PRINTSCREEN);
} catch (AWTException ex) { ex.printStackTrace(); }
}
});
}
}
}
}
此快速编码的目的是演示这个想法。
不是常规方式。您可以对剪贴板进行轮询,也可以检查进程列表(用于屏幕抓取应用程序);对流程的最新支持很好。需要一些探索。