1

我正在开发一个 Java 应用程序,我想从一个我无法访问代码的具体窗口中截取并保存一个屏幕截图。为此,我具有以下功能:

    public void nextStep(){
        final MyUser32 user32 = MyUser32.INSTANCE;
        user32.EnumWindows(new MyUser32.WNDENUMPROC() {

            public boolean callback(HWND hwnd, Pointer userData) {
                byte[] windowText = new byte[512];
                user32.GetWindowTextA(hwnd, windowText, 512);
                String wText = Native.toString(windowText);

            if(wText.contains(MyString)){
                System.out.println("Window hdwn: " + hwnd + " - Text: " + wText);
                User32.INSTANCE.ShowWindow(hwnd, WinUser.SW_MAXIMIZE);
                User32.INSTANCE.SetForegroundWindow(hwnd);
               //I ve tried with setFocus as well and does not work either
                capture();
            }
            return true;
        }
    }, null);
}

capture() 方法如下:

public void capture(){
    Robot robot;
    try {
        robot = new Robot();
    } catch (AWTException e){
        throw new IllegalArgumentException("No robot");
    }
    robot.keyPress(KeyEvent.VK_ALT);
    robot.keyRelease(KeyEvent.VK_UP);
    robot.keyPress(KeyEvent.VK_PRINTSCREEN);
    robot.keyRelease(KeyEvent.VK_PRINTSCREEN);
    robot.keyRelease(KeyEvent.VK_ALT);
    try {
        capt = (BufferedImage) Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.imageFlavor);
        ImageIO.write(capt, "png", new File("captura.png"));
    } catch (HeadlessException | UnsupportedFlavorException | IOException e) {
        e.printStackTrace();
    }
}

MyUser32 类如下:

public interface MyUser32 extends StdCallLibrary {
    MyUser32 INSTANCE = (MyUser32) Native.loadLibrary("user32", MyUser32.class);
    interface WNDENUMPROC extends StdCallCallback {
        boolean callback(HWND hwnd, Pointer arg);
    }
    boolean EnumWindows(WNDENUMPROC lpEnumFunc, Pointer arg);
    int GetWindowTextA(HWND hwnd, byte[] lpString, int nMaxCount);
}

如果变量 MyString 有一个值,可以说,“绘制”这部分代码要做的是:

-列出所有活动窗口

- 对于标题中包含字符串“paint”的每一个:

*打印其信息,如标题和hwnd

*把它最大化到前面

*将其设置为前景窗口(再次,是的)

*应用 capture() 方法,它会:

首先按 alt+up,最大化聚焦窗口,然后按 alt+Capt。屏幕,仅捕获焦点窗口并将其保存在剪贴板中。最后,它将捕获保存为“captura.png”

它适用于大多数窗口,如油漆或谷歌浏览器,但它不适用于我有兴趣捕获的窗口。有时它将它带到前面,有时它没有,没有任何明显的原因,但它永远不会被最大化或捕获,即使 alt+up 和 alt+captScreen 在我的物理键盘上工作得很好,并且窗口的信息被打印出来一直很好。

有人知道如何强制第三个窗口获得焦点吗?我想问题就在那里,但我可能是错的。此外,我没有运行任何其他强制保持焦点的窗口。

非常感谢!

4

0 回答 0