在 Windows 上使用 java 锁屏期间的屏幕截图

目的是只要 java 应用程序正在运行,无论屏幕锁定如何,都可以进行屏幕捕获。我在交流中遇到了几个类似的问题,但所有这些问题都与使用 Selenium 或某些 Windows 特定代码有关。


该代码(见下文)用于java.awt.Robot进行循环屏幕捕获。该文件保存为 png。


问题是,当用户锁定计算机时,截取的屏幕截图是锁定屏幕,而不是电脑解锁时底层屏幕的样子。


如何解决这个问题?


import java.awt.DisplayMode;

import java.awt.GraphicsDevice;

import java.awt.GraphicsEnvironment;

import java.awt.Rectangle;

import java.awt.Robot;

import java.awt.image.BufferedImage;

import java.io.File;

import javax.imageio.ImageIO;


public class Capture{

    public static void main(String[] args) throws Exception {

        GraphicsDevice screen = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();

        DisplayMode dm = screen.getDisplayMode();

        int[] size = {dm.getWidth(), dm.getHeight()};

        Rectangle rect = new Rectangle(size[0], size[1]);

        String path = "D:/img.png";

        Robot rob = new Robot(screen);

        File outfile = new File(path);


        while (true) {

            BufferedImage img = rob.createScreenCapture(rect);

            ImageIO.write(img, "png", outfile);

            Thread.sleep(1000);

        }


    }


}

环境

Windows 10

JDK 12


小怪兽爱吃肉
浏览 203回答 1
1回答

潇潇雨雨

在 Java 中,在锁屏期间便携式捕获底层应用程序是不可能的,也许在任何屏幕捕获解决方案中也是如此。文档说Robot.createScreenCapture:“[它]创建一个包含从屏幕读取的像素的图像。......”这意味着它Robot只能捕获正在呈现到屏幕上的任何内容,并且没有概念/理解/编程能力来检测其内容,例如单个应用程序、通知、小部件等。当呈现的内容是锁屏时,那就是被捕获。这也意味着,当没有向其发送任何内容时(假设监视器/屏幕被操作系统的能源策略关闭,因此不一定会被渲染),则不会捕获任何内容(但可能是黑屏)。为了实现您正在尝试的目标,您需要应用程序特定的挂钩(例如通过它公开的某些 API - 极不可能)或操作系统特定的调用或进程探测。前者取决于应用程序,后者则破坏可移植性。关于一般不可能的备注:视频会议/流媒体/屏幕录制/远程访问应用程序通常会在用户之间共享应用程序特定的屏幕。然而,应用程序(“记录器”)对其他应用程序(“记录器”)的与应用程序无关的感知和访问必然由操作系统来调节,从而破坏了可移植性。更不用说它在锁屏期间停止了。对于音频捕获或任何其他数据流来说同样如此。作为格言,那么:跨应用程序数据捕获要么由目标应用程序公开,要么由操作系统介导。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java