【问题标题】:AWT Robot - only taking screenshot of current program on MacOSAWT Robot - 仅在 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 运行它

标签: java awt screenshot macos-big-sur awtrobot


【解决方案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");
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多