AWT Robot - 仅在 MacOS 上截取当前程序的屏幕截图

Posted

技术标签:

【中文标题】AWT Robot - 仅在 MacOS 上截取当前程序的屏幕截图【英文标题】:AWT Robot - only taking screenshot of current program on MacOS 【发布时间】:2021-12-07 09:23:44 【问题描述】:

我正在创建一个简单的测试程序来截取整个屏幕,经过一些研究,我创建了以下代码:

public class PrintScreenCatcher 

    public String capture()
        try 
            Rectangle rectangle = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
            Robot robot = new Robot();
            BufferedImage screenShot = robot.createScreenCapture(rectangle);
            File file=createTempFilePath();
            ImageIO.write(screenShot, "jpg", file);
            return file.getAbsolutePath();
         catch (Exception e) 
            e.printStackTrace();
            return null;
        
    

    private File createTempFilePath() throws IOException 
        DateTimeFormatter formatter=DateTimeFormatter.ofPattern("yyyyMMddHHmmssS");
        return File.createTempFile("screen-"+LocalDateTime.now().format(formatter),".jpg");
    

运行此程序后,我期待一个带有整个屏幕的图像(MacOS 菜单、Intellij 等):

我得到了一张只包含我桌面背景的图片:

我认为机器人试图只截取我的程序的屏幕截图。我应该怎么做才能对打开的屏幕进行截图?

【问题讨论】:

你是如何运行你的代码的?主要方法在哪里? @GilbertLeBlanc 我正在通过 junit 运行它 【参考方案1】:

问题在于 MacOS 权限。根据这个answer,程序需要权限才能录屏。我只是在 System Preferences -> Security and Privacy -> Privacy -> Screen Recording 中添加了对 IntelliJ 的访问权限,它就起作用了。

【讨论】:

【参考方案2】:

我添加了一个 main 方法,并在 Windows 10 上使用 Java 14.0.2 捕获了以下图像,代码编译为 Java 8 标准。

这是我运行的代码。如果你在 Mac 上仍然出现黑屏,那我帮不了你。

import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

import javax.imageio.ImageIO;

public class PrintScreenCatcher 

    public static void main(String[] args) 
        System.out.println(new PrintScreenCatcher().capture());
    

    public String capture() 
        try 
            Rectangle rectangle = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
            Robot robot = new Robot();
            BufferedImage screenShot = robot.createScreenCapture(rectangle);
            File file = createTempFilePath();
            ImageIO.write(screenShot, "jpg", file);
            return file.getAbsolutePath();
         catch (Exception e) 
            e.printStackTrace();
            return null;
        
    

    private File createTempFilePath() throws IOException 
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssS");
        return File.createTempFile("screen-" + LocalDateTime.now().format(formatter), ".jpg");
    


【讨论】:

以上是关于AWT Robot - 仅在 MacOS 上截取当前程序的屏幕截图的主要内容,如果未能解决你的问题,请参考以下文章

截屏操作__Robot对象__截取当前分辨率的截图

java截取电脑全屏

java屏幕截取

java.awt.AWTException:java.awt.Robot.(Robot.java:94) 的无头环境 [重复]

使用 java.awt.Robot 模拟退格键

Java.awt.robot mousepress 没有任何效果