我正在尝试创建一个Java应用程序,它可以从其他活动窗口程序中获取信息,例如信息栏,甚至是其他活动窗口的屏幕截图。
在这种情况下,JNI是唯一的选择吗?
感谢。
答案 0 :(得分:0)
使用纯Java无法实现这些目标。
您的选择是通过JNI / JNI使用本机库,或使用Runtime.exec(...)
调用某些外部应用程序。
答案 1 :(得分:0)
获取有关操作系统的其他项目的信息需要使用OS特定方法。您可以从程序内部启动一些脚本,并获取一些信息来读取这些脚本的输出? 否则JNI就是你要走的路。 Java背后的整个想法是独立于平台,这是通过隐藏操作系统来实现的。
可以截图
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class RobotExp {
public static void main(String[] args) {
try {
Robot robot = new Robot();
// Capture the screen shot of the area of the screen defined by the rectangle
BufferedImage bi=robot.createScreenCapture(new Rectangle(100,100));
ImageIO.write(bi, "jpg", new File("C:/imageTest.jpg"));
} catch (AWTException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
答案 2 :(得分:0)
您可以使用以下代码,并能够检索已激活窗口的屏幕截图。
此外, 要捕获窗口更好的裁剪图像,请根据需要调整以下变量
private static int adjustLeft = 6;
private static int fineCutterX = 6;
private static int fineCutterY = 6;
public void getActiveWindowImage() {
char[] buffer = new char[MAX_TITLE_LENGTH * 2];
HWND hwnd = User32.INSTANCE.GetForegroundWindow();
User32.INSTANCE.GetWindowText(hwnd, buffer, MAX_TITLE_LENGTH);
System.out.println("Active window title: " + Native.toString(buffer));
RECT rect = new RECT();
User32.INSTANCE.GetWindowRect(hwnd, rect);
int x = rect.left + adgustLeft;
int y = rect.top;
int width = rect.right - x - fineCutterX;
int hieght = rect.bottom - y - fineCutterY;
System.out.println(x + "," + y + "," + width + "," + hieght);
System.out.println("rect = " + rect);
Robot robot = null;
try {
robot = new Robot();
} catch (AWTException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Capture the screen shot of the area of the screen defined by the rectangle
BufferedImage bi = robot.createScreenCapture(new Rectangle(x, y, width, hieght));
try {
ImageIO.write(bi, "jpg", new File("<File Path you need to save>"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}