2012-09-04 22 views
5

[適用於Windows] 我知道可以捕獲在C#語言下運行的DirectX程序的屏幕,但是您知道Java的一些示例代碼嗎?全屏捕獲Java中的DirectX程序(Javacv?)

我實際上面臨着這個問題,而不是這個Take screen shots inside of full screen applications with java?。機器人班沒有幫助,也沒有工作。

但是,我沒有在互聯網上找到關於此的任何Java代碼的示例。 感謝您提供有關此主題的任何幫助。

+0

看看[ScreenshotUsingPrintScreen](http://stackoverflow.com/a/12251447/418556)產生一個'的mimetype =圖像/ X-java的 - 圖像; representationclass = java.awt.Image'。 –

+0

有趣的,好的方式和想法來解決這個問題。經過一些快速檢查後,我得到了關於剪貼板的錯誤。就像它被Windows上的另一個進程使用一樣,我認爲。 – Arsenic

+0

解決它在getSystemClipBoard之前將空分配給cb,這樣就可以簡單地清除每個Windows使用前的空白。 – Arsenic

回答

2

由於我的工作更,也參見:

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

好主意,但實際上並不適用於全屏幕的DirectX程序。剛剛嘗試過,沒有工作,不知道爲什麼。就好像按下並釋放的按鍵被禁用了一樣。 – Arsenic

+0

模擬'Ubuntu'上的'PRINT_SCREEN'將啓動ScreenShot Manager應用程序,用戶必須按下其上的Copy to Clipboard按鈕才能將其帶到剪貼板。 –