【问题标题】:Full screen capture of a DirectX program in java (Javacv ?)Java中DirectX程序的全屏截图(Javacv?)
【发布时间】:2012-09-04 22:05:20
【问题描述】:

[对于 Windows] 我知道可以捕获在 C# 语言下运行的 DirectX 程序的屏幕,但是你知道一些 Java 的示例代码吗?

我实际上面临的问题与Take screen shots inside of full screen applications with java? 相同。机器人课程没有帮助,也没有工作。

但是我没有在互联网上找到任何与此相关的 java 代码示例。 感谢您在此主题上提供的任何帮助。

【问题讨论】:

  • 查看ScreenshotUsingPrintScreen 是否产生mimetype=image/x-java-image;representationclass=java.awt.Image
  • 有趣,解决问题的好方法和想法。经过一些快速检查后,我收到了有关剪贴板的错误。就像它被 Windows 上的另一个进程使用一样,我假设。
  • 解决了在getSystemClipBoard之前将null分配给cb,这样它就可以简单地清除每个pre Windows使用。
  • 无论如何,我还是卡住了。 (舞蹈)

标签: java directx screen capture


【解决方案1】:

由于我在这方面做了更多工作,另请参阅:

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);
            }
        }
    }
}

【讨论】:

  • 好主意,但实际上不适用于全屏的 DirectX 程序。刚试了,没用,不知道为什么。好像按下和释放的键被禁用了。
  • Ubuntu 上模拟PRINT_SCREEN 会启动ScreenShot Manager 应用程序,用户必须按下其上的Copy to Clipboard 按钮才能将其带到剪贴板。
猜你喜欢
  • 2011-10-04
  • 2023-03-18
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
相关资源
最近更新 更多