我正在开发一个 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 在我的物理键盘上工作得很好,并且窗口的信息被打印出来一直很好。
有人知道如何强制第三个窗口获得焦点吗?我想问题就在那里,但我可能是错的。此外,我没有运行任何其他强制保持焦点的窗口。
非常感谢!