在全屏应用程序中防止屏幕截图(打印屏幕)

时间:2017-11-23 10:49:52

标签: java pdf fullscreen printscreen piracy

我需要阻止“打印屏幕”按钮制作的屏幕截图。并通过第三方软件。

我决定使用全屏,以便他们无法使用第三方软件制作屏幕截图。

但我仍然不知道如何阻止截图。

PS。这个应用程序与打击盗版有关。我不希望我的大型电子书免费共享。我想到了视频等,但写作更多的是我做的。

这样他们复制它的唯一方法就是用高清摄像头拍照。

有谁知道它是否可能?我还没有发现任何相关信息。

3 个答案:

答案 0 :(得分:2)

简单回答:你做不到。

创建屏幕截图通常是底层操作系统的一项功能。在OS之上运行的Java应用程序不能限制在该OS上运行的其他进程。或者限制该操作系统提供的功能。即使你可以 - 没有什么可以阻止人们在虚拟机中运行操作系统,然后从运行VM的主机屏幕截图。

除此之外:创建屏幕截图是非常宝贵的功能。您知道,也许有人想为您的应用程序创建一些屏幕截图,以记录其对同事的使用情况。或者有人想在这里或那里有一个屏幕截图来为自己记录某些方面。现在你来了并宣称:“抱歉,根本没有屏幕截图”。这有一定的潜力可以让你的用户离开。没有什么比说服用户说你的产品具有糟糕的用户体验更糟糕了。

从这个意义上说,你的问题没有好的技术解决方案。恰恰相反:很可能你将不得不花费相当多的努力来获得正在运行的任何东西(如上所述:在VM设置中你可以完全没有)。相反,我会花费我的资源以合理的成本创造出色的用户体验。不要把精力集中在限制用户身上。

答案 1 :(得分:0)

不是经常性的。您可以轮询剪贴板并查看进程列表(对于屏幕抓取器应用程序);最新的流程支持很好。需要进行一些探索。

答案 2 :(得分:0)

你不能阻止它,但你可以尝试在某种程度上覆盖它 想法是检测到按下了打印屏幕,隐藏了要隐藏的内容,并调用另一个打印屏幕,覆盖了之前的打印屏幕。
这不是很强大,当然有局限性,可以绕过,但可以给你基本的控制。
这个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();  }
                    }
                });

            }
        }
    }
}

这个快速代码的目的是展示这个想法。

相关问题