8

Я пытаюсь использовать область изображения для печати, чтобы получить 2 монитора, но работает только для одного монитора. Можете ли вы посоветовать мне, как получить монитор 2-го уровня?java print screen два монитора

 Robot robot = new Robot();  
     Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()); 
     BufferedImage capture = new Robot().createScreenCapture(screenRect); 
     ImageIO.write(capture, "bmp", new File("printscreen.bmp")); 

ответ

13

Союз вместе границы каждого экрана:

Rectangle screenRect = new Rectangle(0, 0, 0, 0); 
for (GraphicsDevice gd : GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()) { 
    screenRect = screenRect.union(gd.getDefaultConfiguration().getBounds()); 
} 
BufferedImage capture = new Robot().createScreenCapture(screenRect); 
+0

waw! более высокий балл и простой, но никто не комментирует? : D – gumuruh

+0

как насчет, если нам просто нужен только второй экран ....? мы можем пересечь? как насчет кода .... – gumuruh

3

Вы можете попробовать:

int width = 0; 
int height = 0; 

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

for (GraphicsDevice curGs : gs) 
{ 
    DisplayMode mode = curGs.getDisplayMode(); 
    width += mode.getWidth(); 
    height = mode.getHeight(); 
} 

Это должно рассчитать общую ширину нескольких экранов. Очевидно, что он поддерживает только горизонтально выровненные экраны в форме выше - вам придется анализировать границы графических конфигураций для обработки других выравниваний мониторов (зависит от того, насколько пуленепробиваемый вы хотите это сделать).

Если ваш главный монитор находится на правой стороне, и вы хотите, чтобы получить изображение, даже с левой стороны, использовать это:

Rectangle screenRect = new Rectangle(-(width/2), 0, width, height); 
BufferedImage capture = new Robot().createScreenCapture(screenRect); 
ImageIO.write(capture, "bmp", new File("printscreen.bmp")); 
+0

Спасибо за ответ, я попробовал и это работает , но проблема в том, что: программа сфотографирует главный монитор и монитор справа (НО у меня второй монитор слева) – Faken143

+0

Насколько я понимаю, вы передаете размер прямоугольника, если ваш экран, заданный набором инструментов метод получить размер экрана. Как насчет попыток большего размера? Возможно, это работает .. – LMG

+0

@ LMG проблема не в размере, проблема в том, что позиция, потому что по умолчанию ее 0,0, но это на правом экране, левый экран игнорируется –

0

Это код, который я использовал и протестировал, он работает, он создает два png-файла внутри папки res (смените его на вашу папку) один для моего основного, а другой для вторичного экрана. я также напечатали информацию Bounds о Displays, если вы хотите, оба дисплея в одном изображении, просто добавьте ширину обоих мониторов, и вы будете иметь его

public static void screenMultipleMonitors() { 
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
    GraphicsDevice[] gDevs = ge.getScreenDevices(); 

    for (GraphicsDevice gDev : gDevs) { 
     DisplayMode mode = gDev.getDisplayMode(); 
     Rectangle bounds = gDev.getDefaultConfiguration().getBounds(); 
     System.out.println(gDev.getIDstring()); 
     System.out.println("Min : (" + bounds.getMinX() + "," + bounds.getMinY() + ") ;Max : (" + bounds.getMaxX() 
       + "," + bounds.getMaxY() + ")"); 
     System.out.println("Width : " + mode.getWidth() + " ; Height :" + mode.getHeight()); 

     try { 
      Robot robot = new Robot(); 

      BufferedImage image = robot.createScreenCapture(new Rectangle((int) bounds.getMinX(), 
        (int) bounds.getMinY(), (int) bounds.getWidth(), (int) bounds.getHeight())); 
      ImageIO.write(image, "png", 
        new File("src/res/screen_" + gDev.getIDstring().replace("\\", "") + ".png")); 

     } catch (AWTException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
}