MacOS中某些应用程序的Java屏幕截图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MacOS中某些应用程序的Java屏幕截图相关的知识,希望对你有一定的参考价值。

我想在我的MacOS中截取某些应用程序的屏幕截图,即使在另一个虚拟屏幕上也没有在活动屏幕中。

我可以使用以下代码进行活动屏幕捕获,但如何捕获给定的应用程序?

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.imageio.ImageIO;

public class Screenshot {
    public static void main(String args[]) throws AWTException, IOException {
        while(true) {
            String timeStamp = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new Date());

            BufferedImage screencapture = new Robot().createScreenCapture(
                new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())
            );

            // Save as JPEG
            File file = new File("./screens/screencapture" + timeStamp + ".jpg");
            ImageIO.write(screencapture, "jpg", file);

            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
答案

尝试使用/ usr / sbin / screencapture,然后调用它

Runtime.getRuntime().exec("/usr/sbin/screencapture");

这是screencapture的使用输出

usage: screencapture [-icMPmwsWxSCUtoa] [files]
  -c         force screen capture to go to the clipboard
  -C         capture the cursor as well as the screen. only in non-interactive modes
  -d         display errors to the user graphically
  -i         capture screen interactively, by selection or window
               control key - causes screen shot to go to clipboard
               space key   - toggle between mouse selection and
                             window selection modes
               escape key  - cancels interactive screen shot
  -m         only capture the main monitor, undefined if -i is set
  -M         screen capture output will go to a new Mail message
  -o         in window capture mode, do not capture the shadow of the window
  -P         screen capture output will open in Preview
  -s         only allow mouse selection mode
  -S         in window capture mode, capture the screen not the window
  -t<format> image format to create, default is png (other options include pdf, jpg, tiff and other formats)
  -T<seconds> Take the picture after a delay of <seconds>, default is 5
  -w         only allow window selection mode
  -W         start interaction in window selection mode
  -x         do not play sounds
  -a         do not include windows attached to selected windows
  -r         do not add dpi meta data to image
  -l<windowid> capture this windowsid
  -R<x,y,w,h> capture screen rect
  files   where to save the screen capture, 1 file per screen

我认为带窗口id的-w选项是要使用的选项。但要获得窗口ID,您可能需要另一个实用程序。其中一个实用工具是pyscreencapture。否则我肯定谷歌搜索如何获取窗口ID将导致更多的方法来获取您需要的窗口ID。

虽然我不完全确定您的虚拟屏幕是什么意思,但您可能在获取窗口ID或捕获屏幕时遇到问题。

另一答案

“不幸的是”你需要JNI。基本上你需要访问Cocoa的一些CoreGraphicsImageIO API。算法如下:

  1. 调用CGWindowListCopyWindowInfo()获取有关系统中所有窗口的信息。
  2. 提取您感兴趣的窗口,最好的方法是通过所有者pid来完成,因为上述函数返回了此信息
  3. 通过调用ImageRef创建一个CGWindowListCreateImage()
  4. 要么通过CGImageDestinationRef函数获取上述ImageRef的数据,要么将其保存到文件中。

由于Java无法直接调用Cocoa函数,因此需要Java和Cocoa之间的桥梁,这是一个利用JNI允许Java代码到达ObjectiveC实现函数的桥梁。

你的问题提出了相当大的挑战,所以我开始了一个github(https://github.com/cristik/cocoa4java)的小项目,它提供了拍摄应用程序窗口快照所需的功能。我认为你会找到你需要的一切,包括找到与进程相关的窗口,以及检索这些窗口的快照。还有一个小型示例类,它使用这些功能来帮助您开始使用库。

以上是关于MacOS中某些应用程序的Java屏幕截图的主要内容,如果未能解决你的问题,请参考以下文章

一款开源的截图神器,支持 macOS/Windows/Linux

如何在 Android 片段中禁用屏幕截图?

在当前的android片段中禁用屏幕截图[重复]

macOS:SwiftUI:MenuItem 用于截取 WKWebView 的屏幕截图并将其保存到带有时间戳的 ~/Pictures?

使用 Java 代码在 Android 上捕获屏幕截图 [重复]

在某些片段中隐藏导航抽屉