使用java获取其他程序的活动窗口

时间:2010-05-30 07:13:34

标签: java windows java-native-interface

我正在尝试创建一个Java应用程序,它可以从其他活动窗口程序中获取信息,例如信息栏,甚至是其他活动窗口的屏幕截图。

在这种情况下,JNI是唯一的选择吗?

感谢。

3 个答案:

答案 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();
    }
}