MacOS中某些应用程序的Java屏幕截图
我想在我的MacOS中拍摄某些应用的屏幕截图,即使是在另一个虚拟屏幕上,而不是在活动屏幕上 我可以用以下代码进行活动屏幕捕获,但如何捕获给定的应用程序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
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()
获取系统中所有窗口的信息CGWindowListCreateImage()
cgmagedestinationref
函数获取上述ImageRef的数据,或将其保存到文件中你的问题带来了很大的挑战,所以我启动了一个github()的小项目,它提供了拍摄应用程序窗口快照所需的功能。我认为您将在那里找到所需的一切,包括查找与进程关联的窗口,以及检索这些窗口的快照。还有一个小示例类利用这些功能帮助您开始使用库。如何识别要捕获的窗口?@MadProgrammer不知道,可以在codevirtual desktop中修复应用程序虚拟桌面:啊,我知道虚拟桌面。他对虚拟屏幕这个词不太确定。我认为这与在virtualbox上运行的应用程序有关,mac作为来宾操作系统。我想使用带有pid的屏幕截图,但它是以交互方式打开的。
JNI、CoreGraphics、ImageIO、Cocoa
-真的吗?就像我一个都不知道一样,我想有很多东西要读:-)谢谢你的回购;但我一般不喜欢JNI。这并不是说它错了——它完成了任务,但是仍然很好,不确定它是否可以在没有JNI的情况下完成,除非Java将提供对Cocoa(ObjectiveC Mac API)函数的访问。关于我列举的框架,除非您想切换到Objective,否则您不需要阅读它们,因为这些框架是本机的:)