javapdffullscreenprintscreenpiracy

Preventing Screenshots (Print Screen) In Full screen Application


I have a need to prevent screenshots made by Print Screen button. And by third party software.

I decided to use fullscreen so they can't use their third party software to make a screenshot.

But I still have no clue how to prevent screenshot.

PS. This app is related to fighting piracy. I don't want my massive ebooks to be shared for free. I thought of videos etc instead but writing is more how I do it.

This way their only method to copy it will be making photos with a HD camera.

Does anyone know if it's possible? I haven't found anything about this.


Solution

  • You can not prevent it, but you can try, to a certain extent, overwrite it.
    The idea is detect that a print screen was pressed, hide what you want to hide, and invoke another print screen, overwriting the previous one.
    This is not robust, and of course has limitations and can be by-passed, but can give you basic control.
    This swing basic demonstration was tested on my windows machine:

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

    The purpose of this quick-code is to demonstrate the idea.