目的是只要 java 应用程序正在运行,无论屏幕锁定如何,都可以进行屏幕捕获。我在交流中遇到了几个类似的问题,但所有这些问题都与使用 Selenium 或某些 Windows 特定代码有关。该代码(见下文)用于java.awt.Robot进行循环屏幕捕获。该文件保存为 png。问题是,当用户锁定计算机时,截取的屏幕截图是锁定屏幕,而不是电脑解锁时底层屏幕的样子。如何解决这个问题?import java.awt.DisplayMode;import java.awt.GraphicsDevice;import java.awt.GraphicsEnvironment;import java.awt.Rectangle;import java.awt.Robot;import java.awt.image.BufferedImage;import java.io.File;import javax.imageio.ImageIO;public class Capture{ public static void main(String[] args) throws Exception { GraphicsDevice screen = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); DisplayMode dm = screen.getDisplayMode(); int[] size = {dm.getWidth(), dm.getHeight()}; Rectangle rect = new Rectangle(size[0], size[1]); String path = "D:/img.png"; Robot rob = new Robot(screen); File outfile = new File(path); while (true) { BufferedImage img = rob.createScreenCapture(rect); ImageIO.write(img, "png", outfile); Thread.sleep(1000); } }}环境Windows 10JDK 12
1 回答
潇潇雨雨
TA贡献1833条经验 获得超4个赞
在 Java 中,在锁屏期间便携式捕获底层应用程序是不可能的,也许在任何屏幕捕获解决方案中也是如此。文档说Robot.createScreenCapture
:
“[它]创建一个包含从屏幕读取的像素的图像。......”
这意味着它Robot
只能捕获正在呈现到屏幕上的任何内容,并且没有概念/理解/编程能力来检测其内容,例如单个应用程序、通知、小部件等。当呈现的内容是锁屏时,那就是被捕获。
这也意味着,当没有向其发送任何内容时(假设监视器/屏幕被操作系统的能源策略关闭,因此不一定会被渲染),则不会捕获任何内容(但可能是黑屏)。
为了实现您正在尝试的目标,您需要应用程序特定的挂钩(例如通过它公开的某些 API - 极不可能)或操作系统特定的调用或进程探测。前者取决于应用程序,后者则破坏可移植性。
关于一般不可能的备注:视频会议/流媒体/屏幕录制/远程访问应用程序通常会在用户之间共享应用程序特定的屏幕。然而,应用程序(“记录器”)对其他应用程序(“记录器”)的与应用程序无关的感知和访问必然由操作系统来调节,从而破坏了可移植性。更不用说它在锁屏期间停止了。
对于音频捕获或任何其他数据流来说同样如此。作为格言,那么:
跨应用程序数据捕获要么由目标应用程序公开,要么由操作系统介导。
添加回答
举报
0/150
提交
取消