为了账号安全,请及时绑定邮箱和手机立即绑定

在 Windows 上使用 java 锁屏期间的屏幕截图

在 Windows 上使用 java 锁屏期间的屏幕截图

小怪兽爱吃肉 2023-12-21 10:39:47
目的是只要 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 - 极不可能)或操作系统特定的调用或进程探测。前者取决于应用程序,后者则破坏可移植性。

关于一般不可能的备注:视频会议/流媒体/屏幕录制/远程访问应用程序通常会在用户之间共享应用程序特定的屏幕。然而,应用程序(“记录器”)对其他应用程序(“记录器”)的与应用程序无关的感知和访问必然由操作系统来调节,从而破坏了可移植性。更不用说它在锁屏期间停止了。

对于音频捕获或任何其他数据流来说同样如此。作为格言,那么:

跨应用程序数据捕获要么由目标应用程序公开,要么由操作系统介导。


查看完整回答
反对 回复 2023-12-21
  • 1 回答
  • 0 关注
  • 90 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信