Как получить скриншот любого приложения Linux / Windows, работающего вне JVM - PullRequest
6 голосов
/ 25 декабря 2011

Можно ли использовать Java для получения снимка экрана приложения, внешнего по отношению к Java, например, VLC / Windows Media Player, сохранить его как объект Image, а затем отобразить его в JLabel или в чем-то подобном?Кто-нибудь знает, возможно ли это, и если да, то есть ли у кого-нибудь общее представление о том, как это сделать?

Примечание. Мне просто нужно выяснить, как получить снимок экрана и сохранить его в виде изображения.объект.После этого я могу использовать, манипулировать им, отображать его и т. Д.

Ответы [ 2 ]

3 голосов
/ 25 декабря 2011

Вот ответ для Windows (не уверен, что alt + printScr работает на Linux: P)

Я думаю, один из способов достижения этого

1. использование класса Robot для запуска команды alt + printScreen (захватывает активное окно в буфер обмена)

2. читать в буфер обмена!

Вот две части кода, которые делают это. Я на самом деле не пытался, но то, что я собрал воедино.

Команды Code to Fire для получения активного окна в буфере обмена

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;

public class ActiveWindowScreenShot
{
 /**
  * Main method
  * 
  * @param args (not used)
  */
 public static void main(String[] args)
 {
  Robot robot;

  try {
   robot = new Robot();
  } catch (AWTException e) {
   throw new IllegalArgumentException("No robot");
  }

  // Press Alt + PrintScreen
  // (Windows shortcut to take a screen shot of the active window)
  robot.keyPress(KeyEvent.VK_ALT);
  robot.keyPress(KeyEvent.VK_PRINTSCREEN);
  robot.keyRelease(KeyEvent.VK_PRINTSCREEN);
  robot.keyRelease(KeyEvent.VK_ALT);

  System.out.println("Image copied.");
 }
}

Код для чтения изображения в буфере обмена

// If an image is on the system clipboard, this method returns it;
// otherwise it returns null.
public static Image getClipboard() {
    Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);

    try {
        if (t != null && t.isDataFlavorSupported(DataFlavor.imageFlavor)) {
            Image text = (Image)t.getTransferData(DataFlavor.imageFlavor);
            return text;
        }
    } catch (UnsupportedFlavorException e) {
    } catch (IOException e) {
    }
    return null;
}

Вы можете управлять контролем так, как вам нужно! Дайте мне знать, если это работает для вас. но это, конечно, моя задача - попробовать!

2 голосов
/ 25 декабря 2011

Вы можете получить снимок экрана всего экрана, используя класс с именем Robot.К сожалению, вы не можете получить расположение и размер окон, которые принадлежат другим приложениям, используя чисто Java-решениеДля этого вам понадобятся другие инструменты (скриптинг, JNI, JNA).Эти инструменты не являются кроссплатформенными.

...