получить активное окно других программ, использующих Java - PullRequest
1 голос
/ 30 мая 2010

Я пытаюсь создать Java-приложение, которое может получать информацию из другой активной оконной программы, такой как информационная панель, или даже снимок экрана другого активного окна.

Является ли JNI единственным вариантом в этом случае?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 31 мая 2010

Получение информации о других элементах в операционной системе должно осуществляться с помощью специальных средств ОС. Возможно, вы сможете запустить некоторые скрипты изнутри вашей программы и получить некоторую информацию, читая вывод этих скриптов?
В противном случае 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();
        }
    }
}
0 голосов
/ 17 июля 2018

Вы можете использовать следующий код и получить скриншот активированного окна.

Кроме того, Чтобы получить более качественное изображение окна, настройте следующие переменные как вам нужно

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();
    }
}
0 голосов
/ 30 мая 2010

Эти вещи невозможны при использовании чистой Java.

Вы можете использовать собственные библиотеки через JNI / JNI или вызывать какое-то внешнее приложение, используя Runtime.exec(...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...