目的是只要 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
提交
取消