2012-09-04 29 views
5

[Para Windows] Sé que es posible capturar la pantalla de un programa DirectX que se ejecuta en lenguaje C#, pero ¿conoce algún código de muestra para Java?Captura de pantalla completa de un programa DirectX en java (Javacv?)

En realidad estoy enfrentando este mismo problema que este Take screen shots inside of full screen applications with java?. La clase de robot no ayudó y tampoco funcionó.

Pero todavía no encontré ninguna muestra de código de Java en Internet referente a esto. Gracias por cualquier ayuda que pueda brindar sobre este tema.

+0

ver si [ScreenshotUsingPrintScreen] (http://stackoverflow.com/a/12251447/418556) produce un tipo MIME '= image/x-java -image; representationclass = java.awt.Image'. –

+0

Interesante, buena manera e idea para evitar el problema. Después de una comprobación rápida recibí un error sobre el portapapeles. Como si fuera utilizado por otro proceso en Windows, supongo. – Arsenic

+0

Lo resolvió al asignar null a cb antes de getSystemClipBoard, de esta forma simplemente borra todos los usos previos de Windows. – Arsenic

Respuesta

2

ya que trabajé en él más, consulta:

import java.awt.*; 
import java.awt.datatransfer.*; 
import java.awt.event.KeyEvent; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 

import javax.imageio.ImageIO; 
import java.io.File; 

public class ClipboardScreenshot { 

    public static void main(String[] args) throws Exception { 
     // get the screenshot 
     Robot robot = new Robot(); 
     robot.keyPress(KeyEvent.VK_PRINTSCREEN); 
     robot.delay(40); 
     robot.keyRelease(KeyEvent.VK_PRINTSCREEN); 
     robot.delay(404); 

     Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); 
     DataFlavor[] flavors = cb.getAvailableDataFlavors(); 
     System.out.println("After: "); 
     for (DataFlavor flavor : flavors) { 
      System.out.println(flavor); 
      if (flavor.toString().indexOf("java.awt.Image")>0) { 
       Object o = cb.getData(flavor); 
       Image i = (Image)o; 
       // ImageIO will not write an Image 
       // It will write a BufferedImage (a type of RenderedImage) 
       BufferedImage bi = new BufferedImage(
         i.getWidth(null), 
         i.getHeight(null), 
         BufferedImage.TYPE_INT_RGB); 
       Graphics2D g = bi.createGraphics(); 
       g.drawImage(i, 0, 0, null); 
       g.dispose(); 

       JScrollPane sp = new JScrollPane(new JLabel(new ImageIcon(bi))); 
       sp.setPreferredSize(new Dimension(800,600)); 
       JOptionPane.showMessageDialog(null, sp); 
       File f = new File(
         System.getProperty("user.home") + 
         File.separator + 
         "the.png"); 
       ImageIO.write(bi, "png", f); 
      } 
     } 
    } 
} 
+0

Buena idea, pero en realidad no funciona para los programas de DirectX en pantalla completa. Solo lo intenté, no funcionó, ni idea de por qué todavía. Como si la tecla presionada y liberada estuviera deshabilitada. – Arsenic

+0

Al simular 'PRINT_SCREEN' en' Ubuntu' se inicia la aplicación 'ScreenShot Manager' y el usuario tiene que presionar el botón' Copy to Clipboard' para llevarlo al portapapeles. –

Cuestiones relacionadas