2010-05-06 74 views
6

這是一個相當棘手的問題,因爲我沒有在網上找到任何信息。基本上,我想知道如何檢查計算機是否在Java中閒置。我希望程序只在計算機處於活動狀態時才能工作,但如果它閒置則不行。Java:檢查PC是否空閒

我能想到做到這一點的唯一方法是掛鉤到鼠標/鍵盤和有一個計時器。

MSN Messenger具有「遠離」功能,我希望有類似的東西。

+0

這樣做沒有可移植的方式。你的目標是什麼系統?你對空閒的定義是什麼? – 2010-05-06 00:12:55

+0

也許你會在這個相關問題中找到解決方案:http://stackoverflow.com/questions/614227/how-to-detect-that-a-pc-has-been-idle-for-30-seconds-using-java – Prine 2010-05-06 00:14:53

回答

0

平臺無關JRE中的任何內容都不會回答此問題。您可以通過測量計算時鐘的時間來猜測,但它不可靠。在特定的平臺上,可能有供應商的API可能會對您有所幫助。

+0

它沒有太多的系統空閒時間,我需要找到。我只需要在最後10分鐘內找到用戶使用那裏的PC。基本上。我希望通知只顯示用戶是否在他們的PC上。 – 2010-05-06 22:46:58

+0

我認爲這比CPU時間使用更不可能。 – bmargulies 2010-05-06 22:59:47

0

1)創建一個新線程。

2)給它一個超級超級低優先級(最低的也可以)

3)每隔一兩秒鐘,紛紛跟帖做一些簡單的任務。如果速度超快,則至少有1個CPU處於空閒狀態。如果速度緩慢,那麼至少有一個內核不會閒置。

只需以低優先級運行您的程序。這將讓操作系統處理讓其他程序在您的程序上運行。

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

不能使用屏幕保護程序。 – 2012-11-16 10:37:26

+0

@Tim,你說得對。必須添加鼠標鼠標監視器... – Reg 2012-11-16 12:55:32

+1

但是,然後再次,爲什麼不只是使用鼠標監視器,其餘的只是查找:) – Reg 2012-11-16 12:57:32