2012-09-04 15 views
5

[Dla Windows] Wiem, że możliwe jest przechwytywanie ekranu programu DirectX działającego w języku C#, ale czy znasz przykładowy kod dla Javy?Przechwytywanie na pełnym ekranie programu DirectX w java (Javacv?)

Mam do czynienia z tym samym problemem niż ten Take screen shots inside of full screen applications with java?. Klasa robotów nie pomogła i nie zadziałała.

Ale jeszcze nie znalazłem próbki kodu Java w Internecie na ten temat. Dziękujemy za pomoc dotyczącą tego tematu.

+0

Sprawdź, czy [ScreenshotUsingPrintScreen] (http://stackoverflow.com/a/12251447/418556) wytwarza 'mimeType = image/x-java -image; representclass = java.awt.Image'. –

+0

Interesujący, dobry sposób i pomysł na spłycenie problemu. Po krótkim sprawdzeniu otrzymałem komunikat o błędzie dotyczący schowka. Tak jak gdyby był używany przez inny proces w systemie Windows, zakładam. – Arsenic

+0

Rozwiązał to przypisanie wartości null do cb przed getSystemClipBoard, w ten sposób po prostu wyczyścił wszystkie aplikacje używane wcześniej przez system Windows. – Arsenic

Odpowiedz

2

Ponieważ pracowałem na nim więcej, zobacz również:

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

Dobry pomysł, ale w rzeczywistości nie działa dla programów DirectX na pełnym ekranie. Po prostu próbowałem, nie działał, nie mam pojęcia, dlaczego jeszcze. Tak jakby klawisz wciśnięty i zwolniony został wyłączony. – Arsenic

+0

Symulacja 'PRINT_SCREEN' na' Ubuntu' uruchamia aplikację 'ScreenShot Manager', a użytkownik musi nacisnąć przycisk' Copy to Clipboard', aby zabrać ją do schowka. –