在全屏应用程序中防止屏幕截图(Print Screen)
Preventing Screenshots (Print Screen) In Full screen Application
我需要防止通过“打印屏幕”按钮截取屏幕截图。并通过第三方软件。
我决定使用全屏,这样他们就不能使用他们的第三方软件来截屏了。
但是我还是不知道怎么防止截图。
PS。此应用程序与打击盗版有关。我不想让我的海量电子书免费共享。我想到了视频等,但我更喜欢写作。
这样他们复制它的唯一方法就是用高清相机拍照。
有人知道这是否可能吗?我还没有找到任何相关信息。
简单回答:不能。
创建屏幕截图通常是底层 操作系统 的一项功能。在 OS 之上的 Java 应用程序 运行 无法限制 OS 上的其他进程 运行。或者限制那个 OS 提供的功能。即使你可以 - 没有什么能阻止人们在虚拟机中 运行 和 OS,然后从运行虚拟机的 host 截屏。
除此之外:创建屏幕截图是一项非常宝贵的功能。您知道,也许有人想为您的应用程序创建一些屏幕截图,以便为他的同事记录它的使用情况。或者有人想在这里或那里截屏来为自己记录某些方面。现在你来宣布:"sorry, no screen shots at all"。这有可能将您的用户拒之门外。没有什么比让您的用户相信您的产品带来糟糕的用户体验更糟糕的了。
从这个意义上讲,您的问题没有很好的技术解决方案。相反:很可能您将不得不花费相当多的努力来获得任何半途而废的东西(并且如前所述:在 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(); }
}
});
}
}
}
}
这个快速代码的目的是演示这个想法。
我需要防止通过“打印屏幕”按钮截取屏幕截图。并通过第三方软件。
我决定使用全屏,这样他们就不能使用他们的第三方软件来截屏了。
但是我还是不知道怎么防止截图。
PS。此应用程序与打击盗版有关。我不想让我的海量电子书免费共享。我想到了视频等,但我更喜欢写作。
这样他们复制它的唯一方法就是用高清相机拍照。
有人知道这是否可能吗?我还没有找到任何相关信息。
简单回答:不能。
创建屏幕截图通常是底层 操作系统 的一项功能。在 OS 之上的 Java 应用程序 运行 无法限制 OS 上的其他进程 运行。或者限制那个 OS 提供的功能。即使你可以 - 没有什么能阻止人们在虚拟机中 运行 和 OS,然后从运行虚拟机的 host 截屏。
除此之外:创建屏幕截图是一项非常宝贵的功能。您知道,也许有人想为您的应用程序创建一些屏幕截图,以便为他的同事记录它的使用情况。或者有人想在这里或那里截屏来为自己记录某些方面。现在你来宣布:"sorry, no screen shots at all"。这有可能将您的用户拒之门外。没有什么比让您的用户相信您的产品带来糟糕的用户体验更糟糕的了。
从这个意义上讲,您的问题没有很好的技术解决方案。相反:很可能您将不得不花费相当多的努力来获得任何半途而废的东西(并且如前所述:在 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(); }
}
});
}
}
}
}
这个快速代码的目的是演示这个想法。