AWT Робот — только делает скриншот текущей программы на macOS

#java #awt #screenshot #macos-big-sur #awtrobot

Вопрос:

Я создаю простую тестовую программу для создания скриншотов всего экрана, после некоторых исследований я создал следующий код:

 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 и т. Д.):

собственный экран печати

Вместо этого я получил изображение, содержащее только фон моего рабочего стола:

экран печати java

Я думаю, что робот пытается сделать снимок экрана только моей программы. Что мне нужно сделать, чтобы сделать снимок экрана с открытыми экранами?

Комментарии:

1. Как вы выполняете свой код? Где основной метод?

2. @GilbertLeBlanc Я запускаю его в июне

Ответ №1:

Проблема заключалась в разрешении macOS. В соответствии с этим ответом программе требуется разрешение на запись экрана. Я просто добавил доступ к IntelliJ в Системные настройки -> Безопасность и конфиденциальность ->> Конфиденциальность ->>> Запись экрана>>> и это сработало.

Ответ №2:

Я добавил основной метод и сделал следующее изображение в 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");
    }

}