2010-05-06 2 views
6

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

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

MSN Messenger имеет эту функцию «прочь», я желаю чего-то подобного этому.

+0

Существует нет портативного способа сделать это. Какие системы вы нацеливаете? Каково ваше определение простоя? –

+0

Возможно, вы найдете решение по этому вопросу: http://stackoverflow.com/questions/614227/how-to-detect-that-a-pc-has-been-idle-for-30-seconds-using-java – Prine

ответ

0

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

+0

Не так много времени простоя системы, которое мне нужно найти. Мне просто нужно найти, что пользователь использует там ПК в течение последних 10 минут. В основном. Я хочу, чтобы уведомления отображались только в том случае, если пользователь фактически находится на своем ПК. –

+0

Я думаю, что это еще более невозможно, чем использование времени процессора. – bmargulies

2

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

That being said here are several ways to do it in Windows. Самый простой, вероятно, настроить JNI и опрашивать

GetLastInputInfo

для клавиатуры и мыши деятельности.

0

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

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

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

Или

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

1

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

вы можете использовать Java-инфо мыши класс, чтобы проверить положение курсора мыши на certian интервалы говорят, как:

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-координаты), это означает, что система простаивает, и вы можете продолжить свое действие, как вы хотите (Надеюсь, это юридическая деятельность, которую вы хотите реализовать :-)

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

1

Вы можете решить эту проблему с помощью класса роботов 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(); 
    } 
} 
+2

Не работает с заставкой. –

+0

@ Тим, ты прав. Должен добавить монитор мышки мыши, а также ... – Reg

+1

Но опять же, почему бы просто не использовать монитор мыши и не вытащить остальное :) – Reg