如何采取任何java本地应用程序的屏幕截图,而不把它带到前台的Java?

yrwegjxp  于 2023-01-24  发布在  Java
关注(0)|答案(1)|浏览(124)

我想截取一个java原生应用程序(任何框架AWT、Swing、JavaFx)的屏幕截图,但不想将其带到前台。是否有任何特定于框架的方法可用于此操作?
我已经尝试使用Robot类来获取屏幕截图

private static void capture(int x, int y , int width , int height, String setName) {
    Robot robot = new Robot();
    Rectangle area = new Rectangle(x, y, width, height);
    BufferedImage image = robot.createScreenCapture(area);
    ImageIO.write(image, "png", new File(System.getProperty("user.dir") + "\\images\\" + setName +".png"));
}

现在,robot类只需获取区域坐标并捕获图像,无论目标应用程序是否位于顶部,为了使应用程序位于顶部,我使用JNA将其聚焦

private static void bringToFocus() {
    for (DesktopWindow desktopWindow : WindowUtils.getAllWindows(true)) {
        if (desktopWindow.getTitle().contains("notepad")) {
            HWND hwnd = User32.INSTANCE.FindWindow(null, desktopWindow.getTitle());
            User32.INSTANCE.SetForegroundWindow(hwnd);
            break;
        }
    }
}

但在这个示例中,我们只需要捕获一个应用程序,如果需要捕获10个应用程序屏幕截图,则需要逐一将它们放到前面,然后捕获并捕获下一个应用程序。
是否有任何框架特定的方法,可以采取应用程序的屏幕截图,而不把它带到前面。

icnyk63a

icnyk63a1#

如果您的屏幕截图只需要是Java GUI,则可以绘制到BufferedImage

public static Image screenShot(Component c) {
  BufferedImage im = new BufferedImage(c.getWidth(), c.getHeight(), BufferedImage.TYPE_INT_ARGB);
  Graphics g = im.getGraphics();
  c.paint(g); // Paint is the proper entry point to painting a (J)Component, rather than paintComponent
  g.dispose(); // You should dispose of your graphics object after you've finished
  return im;
}

如果您的需求是绘制Java GUI组件沿着屏幕的其余部分,但就像java(J)Frame在前面一样,您可以先使用robot绘制屏幕,然后执行我上面发布的操作,但BufferedImage(已经绘制)作为参数传入,而不是在方法中创建。

相关问题