Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的屏幕捕获不是捕获整个屏幕_Java_Macos_Screen_Awt_Awtrobot - Fatal编程技术网

Java中的屏幕捕获不是捕获整个屏幕

Java中的屏幕捕获不是捕获整个屏幕,java,macos,screen,awt,awtrobot,Java,Macos,Screen,Awt,Awtrobot,我有一小段用来记录时间的代码——非常简单,它每四分钟拍一张我的桌面照片,这样以后我就可以回顾我白天所做的事情——它工作得很好,除了当我连接到外部显示器时——这段代码只拍下我笔记本电脑屏幕的截图,不是我使用的更大的外部监视器-有什么想法可以改变代码吗?我正在运行OSX,以防相关 import java.awt.AWTException; import java.awt.Robot; import java.awt.Rectangle; import java.awt.Toolkit; import

我有一小段用来记录时间的代码——非常简单,它每四分钟拍一张我的桌面照片,这样以后我就可以回顾我白天所做的事情——它工作得很好,除了当我连接到外部显示器时——这段代码只拍下我笔记本电脑屏幕的截图,不是我使用的更大的外部监视器-有什么想法可以改变代码吗?我正在运行OSX,以防相关

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;

class ScreenCapture {
    public static void main(String args[]) throws
        AWTException, IOException {
            // capture the whole screen
int i=1000;
            while(true){
i++; 
                BufferedImage screencapture = new Robot().createScreenCapture(
                        new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );

                // Save as JPEG
                File file = new File("screencapture"+i+".jpg");
                ImageIO.write(screencapture, "jpg", file);
try{
Thread.sleep(60*4*1000);
}
catch(Exception e){
e.printStackTrace();
}

            }
        }
}
按照给出的解决方案,我做了一些改进,对于那些感兴趣的人来说,代码正在代码评审中,在

有一个教程演示如何做。 基本上,您必须迭代所有屏幕:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] screens = ge.getScreenDevices();

for (GraphicsDevice screen : screens) {
 Robot robotForScreen = new Robot(screen);
 ...

我知道这是一个老问题,但在公认的答案上链接的解决方案可能在某些多显示器设置上不起作用(当然是在windows上)

如果您的监视器是这样设置的,例如: [3] [1][2]

以下是正确的代码:

public class ScreenshotUtil {

    static public BufferedImage allMonitors() throws AWTException {
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] screens = ge.getScreenDevices();
        Rectangle allScreenBounds = new Rectangle();
        for (GraphicsDevice screen : screens) {
            Rectangle screenBounds = screen.getDefaultConfiguration().getBounds();
            allScreenBounds = allScreenBounds.union(screenBounds);
        }
        Robot robot = new Robot();
        return robot.createScreenCapture(allScreenBounds);;
    }
}