Java: проверка, если компьютер не используется - PullRequest
6 голосов
/ 06 мая 2010

Это довольно сложный вопрос, так как я не нашел информации в Интернете. В основном, я хочу знать, как проверить, простаивает ли компьютер в Java. Я хочу, чтобы программа работала только в том случае, если компьютер активно используется, но если он простаивает, то нет.

Единственный способ сделать это - подключить мышь / клавиатуру и установить таймер.

В MSN Messenger есть эта функция «прочь», я хочу что-то похожее на это.

Ответы [ 5 ]

2 голосов
/ 06 мая 2010

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

Как говорится, есть несколько способов сделать это в Windows .Возможно, проще всего настроить JNI и опросить

GetLastInputInfo

для работы с клавиатурой и мышью.

1 голос
/ 15 февраля 2012

Вы можете решить эту проблему с помощью класса роботов Java.

Используйте класс робота, чтобы сделать снимок экрана, затем подождите, скажем, 60 секунд, и сделайте еще один снимок экрана. Сравните скриншоты друг с другом, чтобы увидеть, есть ли изменения произошло, но не сравнивайте скриншоты попиксельно. Проверьте процент пикселей, который изменился. Причина в том, что вы не хотите, чтобы небольшие различия, такие как часы Windows, влияли на результат. Если процент составляет менее 0,005% (или что-то еще), то компьютер, вероятно, работает на холостом ходу.

import java.awt.AWTException;
import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;

public class CheckIdle extends Thread {
    private Robot robot;
    private double threshHold = 0.05;
    private int activeTime;
    private int idleTime;
    private boolean idle;
    private Rectangle screenDimenstions;

    public CheckIdle(int activeTime, int idleTime) {
        this.activeTime = activeTime;
        this.idleTime = idleTime;

        // Get the screen dimensions
        // MultiMonitor support.
        int screenWidth = 0;
        int screenHeight = 0;

        GraphicsEnvironment graphicsEnv = GraphicsEnvironment
                .getLocalGraphicsEnvironment();
        GraphicsDevice[] graphicsDevices = graphicsEnv.getScreenDevices();

        for (GraphicsDevice screens : graphicsDevices) {
            DisplayMode mode = screens.getDisplayMode();
            screenWidth += mode.getWidth();

            if (mode.getHeight() > screenHeight) {
                screenHeight = mode.getHeight();
            }
        }

        screenDimenstions = new Rectangle(0, 0, screenWidth, screenHeight);

        // setup the robot.
        robot = null;
        try {
            robot = new Robot();
        } catch (AWTException e1) {
            e1.printStackTrace();
        }

        idle = false;
    }

    public void run() {
        while (true) {
            BufferedImage screenShot = robot
                    .createScreenCapture(screenDimenstions);

            try {
                Thread.sleep(idle ? idleTime : activeTime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            BufferedImage screenShot2 = robot
                    .createScreenCapture(screenDimenstions);

            if (compareScreens(screenShot, screenShot2) < threshHold) {
                idle = true;
                System.out.println("idle");
            } else {
                idle = false;
                System.out.println("active");
            }
        }
    }

    private double compareScreens(BufferedImage screen1, BufferedImage screen2) {
        int counter = 0;
        boolean changed = false;

        // Count the amount of change.
        for (int i = 0; i < screen1.getWidth() && !changed; i++) {
            for (int j = 0; j < screen1.getHeight(); j++) {
                if (screen1.getRGB(i, j) != screen2.getRGB(i, j)) {
                    counter++;
                }
            }
        }

        return (double) counter
                / (double) (screen1.getHeight() * screen1.getWidth()) * 100;
    }

    public static void main(String[] args) {
        CheckIdle idleChecker = new CheckIdle(20000, 1000);
        idleChecker.run();
    }
}
1 голос
/ 25 декабря 2010

Я не профессионал, но у меня есть идея:

Вы можете использовать класс информации о java для мыши, чтобы проверять положение мыши с определенными интервалами, например:

import java.awt.MouseInfo;

public class Mouse {
    public static void main(String[] args) throws InterruptedException{
        while(true){
            Thread.sleep(100);
            System.out.println("("+MouseInfo.getPointerInfo().getLocation().x+", "+MouseInfo.getPointerInfo().getLocation().y+")");
        }
    }
}

заменить печатьутверждение с вашей логикой, например, если в течение некоторого интервала, скажем, 1 мин, прошлое положение мыши совпадает с новым положением (вы можете просто сравнить только координаты X), это означает, что система бездействует, и вы можете продолжить свое действиекак вы хотите (Надеюсь, это законная деятельность, которую вы хотите реализовать :-)

Не забудьте реализовать это в новом потоке, в противном случае ваша основная программа будет зависать, чтобы проверить состояние простоя.

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

1) Создать новую тему.

2) Дайте ему супер супер низкий приоритет (самый низкий, который вы можете)

3) Каждую секунду или две поток может выполнять простую задачу. Если супер быстрый, по крайней мере 1 процессор простаивает. Если он работает медленно, то, по крайней мере, 1 ядро ​​не работает вхолостую.

Или

Просто запустите вашу программу с низким приоритетом. Это позволит ОС разрешить запуск других программ поверх вашей программы.

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

Ничто в независимой от платформы JRE не ответит на этот вопрос. Возможно, вы сможете угадать, измерив время часов для расчета, но это не будет надежным. На определенных платформах могут быть API поставщиков, которые могут вам помочь.

...