【问题标题】:Preventing Screenshots (Print Screen) In Full screen Application在全屏应用程序中防止屏幕截图(打印屏幕)
【发布时间】:2017-11-23 10:49:51
【问题描述】:

我需要防止“打印屏幕”按钮进行屏幕截图。并通过第三方软件。

我决定使用全屏,这样他们就不能使用第三方软件来截屏。

但我仍然不知道如何防止屏幕截图。

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

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

有人知道这是否可能吗?我没有找到任何关于此的信息。

【问题讨论】:

    标签: java pdf fullscreen printscreen piracy


    【解决方案1】:

    简单地回答:你不能。

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

    除此之外:创建屏幕截图是一项非常宝贵的功能。您知道,也许有人想为您的应用程序创建一些屏幕截图,以便为他的同事记录其使用情况。或者有人想在这里或那里截屏来为自己记录某些方面。现在你过来宣布:“对不起,根本没有屏幕截图”。这有一定的潜力让你的用户望而却步。没有什么比让您的用户相信您的产品带有糟糕的用户体验更糟糕的了。

    从这个意义上说,您的问题没有好的技术解决方案。相反:很可能您将不得不花费相当多的精力才能让任何东西都可以正常工作(正如所说:在 VM 设置中,您可以完全什么都不做)。相反,我会花费我的资源以合理的成本创造出色的用户体验。不要将精力集中在限制用户上。

    【讨论】:

    • ...即使可以停止底层操作系统的屏幕截图功能,人们仍然可以在虚拟机中运行该程序并从主机操作系统...(只是为了强调你不能...)
    • 确定是对的。也许我会在应用程序中嵌入视频或 mp3。但是文本是我最喜欢的格式
    【解决方案2】:

    你无法阻止它,但你可以尝试在一定程度上覆盖它。
    这个想法是检测到一个打印屏幕被按下,隐藏你想要隐藏的内容,然后调用另一个打印屏幕,覆盖前一个。
    这不是健壮的,当然有限制并且可以绕过,但可以给你基本的控制。
    这个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();  }
                        }
                    });
    
                }
            }
        }
    }
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 没错!我将设置 Prnt Scrn 按钮以将某些文本或某些 meme 复制到剪贴板!聪明的你!谢谢。我将尝试实现这一点。希望它会覆盖屏幕截图。
      • 记住虚拟机。您通常无法控制外部操作系统。
      • 嗯,如果有办法禁止在虚拟机上运行应用程序..
      • @PeterAnson 记住蓝色药丸,虚拟化层可能非常薄且难以掌握......此外,远程桌面解决方案还可以让其他机器获取屏幕内容。
      猜你喜欢
      • 2015-07-07
      • 1970-01-01
      • 2010-10-01
      • 2021-05-26
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      • 2013-09-11
      相关资源
      最近更新 更多