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

MacOS中某些应用程序的Java屏幕截图,java,macos,screenshot,Java,Macos,Screenshot,我想在我的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.te

我想在我的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/screenscapture,并用

Runtime.getRuntime().exec("/usr/sbin/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
用法:截屏[-icMPmwsWxSCUtoa][files]
-c强制屏幕捕获转到剪贴板
-C捕获光标和屏幕。仅在非交互模式下
-d以图形方式向用户显示错误
-我通过选择或窗口以交互方式捕获屏幕
控制键-使屏幕快照转到剪贴板
空格键-在鼠标选择和
窗口选择模式
退出键-取消交互式屏幕截图
-m仅捕获主监视器,如果设置了-i,则未定义
-M屏幕捕获输出将转到新邮件消息
-o在窗口捕获模式下,不要捕获窗口的阴影
-P屏幕捕获输出将在预览中打开
-s仅允许鼠标选择模式
-S在窗口捕获模式下,捕获屏幕而不是窗口
-要创建的t图像格式,默认为png(其他选项包括pdf、jpg、tiff和其他格式)
-T在延迟后拍照,默认值为5
-w仅允许窗口选择模式
-在窗口选择模式下启动交互
-不要播放声音
-a不包括附加到选定窗口的窗口
-r不要将dpi元数据添加到图像
-我捕获这个窗口ID
-捕捉屏幕矩形
用于保存屏幕截图的文件,每个屏幕1个文件
我认为应该使用带有窗口id的-w选项。但是要获取窗口id,您可能需要另一个实用程序。一个这样的效用是。 否则,我相信谷歌搜索如何获取窗口id将导致更多的方式来获取您所需的窗口id

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

“不幸的是”您在这里需要JNI。基本上,您需要访问Cocoa的一些
CoreGraphics
ImageIO
API。算法如下所示:

  • 调用
    CGWindowListCopyWindowInfo()
    获取系统中所有窗口的信息
  • 提取您感兴趣的窗口,最好的方法是通过所有者pid执行,因为此信息由上述函数返回
  • 通过调用
    CGWindowListCreateImage()
  • 通过
    cgmagedestinationref
    函数获取上述ImageRef的数据,或将其保存到文件中
  • 由于Java不能直接调用Cocoa函数,因此需要在Java和Cocoa之间架起一座桥,这座桥利用JNI允许Java代码到达Objective实现的函数


    你的问题带来了很大的挑战,所以我启动了一个github()的小项目,它提供了拍摄应用程序窗口快照所需的功能。我认为您将在那里找到所需的一切,包括查找与进程关联的窗口,以及检索这些窗口的快照。还有一个小示例类利用这些功能帮助您开始使用库。

    如何识别要捕获的窗口?@MadProgrammer不知道,可以在codevirtual desktop中修复应用程序虚拟桌面:啊,我知道虚拟桌面。他对虚拟屏幕这个词不太确定。我认为这与在virtualbox上运行的应用程序有关,mac作为来宾操作系统。我想使用带有pid的屏幕截图,但它是以交互方式打开的。
    JNI、CoreGraphics、ImageIO、Cocoa
    -真的吗?就像我一个都不知道一样,我想有很多东西要读:-)谢谢你的回购;但我一般不喜欢JNI。这并不是说它错了——它完成了任务,但是仍然很好,不确定它是否可以在没有JNI的情况下完成,除非Java将提供对Cocoa(ObjectiveC Mac API)函数的访问。关于我列举的框架,除非您想切换到Objective,否则您不需要阅读它们,因为这些框架是本机的:)