2012-09-04 10 views
5

[Per Windows] So che è possibile acquisire lo schermo di un programma DirectX in esecuzione in linguaggio C#, ma conosci qualche codice di esempio per Java?Acquisizione a schermo intero di un programma DirectX in java (Javacv?)

In realtà sto affrontando questo stesso problema di questo Take screen shots inside of full screen applications with java?. La classe dei robot non ha aiutato e nessuno dei due ha funzionato.

Tuttavia, non ho trovato alcun esempio di codice java su Internet in merito. Grazie per l'aiuto che potresti fornire su questo argomento.

+0

Vedere se [ScreenshotUsingPrintScreen] (http://stackoverflow.com/a/12251447/418556) produce un 'mimetype = image/x-java -image; representationclass = java.awt.Image'. –

+0

Interessante, buon modo e idea per aggirare il problema. Dopo alcuni controlli rapidi ho ricevuto un errore relativo agli appunti. Come se fosse usato da un altro processo su Windows, presumo. – Arsenic

+0

Risolto il problema con l'assegnazione di null a cb prima di getSystemClipBoard, in questo modo si cancella semplicemente ogni pre utilizzato da Windows. – Arsenic

risposta

2

Dal momento che ho lavorato di più, vedi anche:

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

Buona idea, ma in realtà non funziona per i programmi DirectX a schermo intero. Ho appena provato, non ha funzionato, non ho idea del perché ancora. Come se il tasto premuto e rilasciato fosse disabilitato. – Arsenic

+0

La simulazione di 'PRINT_SCREEN' su' Ubuntu' avvia l'applicazione 'ScreenShot Manager' e l'utente deve premere il pulsante' Copia negli Appunti' su di esso per portarlo negli appunti. –