這是一個相當棘手的問題,因爲我沒有在網上找到任何信息。基本上,我想知道如何檢查計算機是否在Java中閒置。我希望程序只在計算機處於活動狀態時才能工作,但如果它閒置則不行。Java:檢查PC是否空閒
我能想到做到這一點的唯一方法是掛鉤到鼠標/鍵盤和有一個計時器。
MSN Messenger具有「遠離」功能,我希望有類似的東西。
這是一個相當棘手的問題,因爲我沒有在網上找到任何信息。基本上,我想知道如何檢查計算機是否在Java中閒置。我希望程序只在計算機處於活動狀態時才能工作,但如果它閒置則不行。Java:檢查PC是否空閒
我能想到做到這一點的唯一方法是掛鉤到鼠標/鍵盤和有一個計時器。
MSN Messenger具有「遠離」功能,我希望有類似的東西。
平臺無關JRE中的任何內容都不會回答此問題。您可以通過測量計算時鐘的時間來猜測,但它不可靠。在特定的平臺上,可能有供應商的API可能會對您有所幫助。
它沒有太多的系統空閒時間,我需要找到。我只需要在最後10分鐘內找到用戶使用那裏的PC。基本上。我希望通知只顯示用戶是否在他們的PC上。 – 2010-05-06 22:46:58
我認爲這比CPU時間使用更不可能。 – bmargulies 2010-05-06 22:59:47
Java無法在應用程序之外的系統級與鍵盤或鼠標進行交互。
That being said here are several ways to do it in Windows。最簡單的可能是建立JNI和輪詢
GetLastInputInfo
的鍵盤和鼠標活動。
1)創建一個新線程。
2)給它一個超級超級低優先級(最低的也可以)
3)每隔一兩秒鐘,紛紛跟帖做一些簡單的任務。如果速度超快,則至少有1個CPU處於空閒狀態。如果速度緩慢,那麼至少有一個內核不會閒置。
或
只需以低優先級運行您的程序。這將讓操作系統處理讓其他程序在您的程序上運行。
我不是專業的,但我有一個想法:
你可以使用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座標),這意味着系統處於空閒狀態,並且您可以根據需要繼續進行操作(希望這是您要實施的合法活動:-)
不要在新的線程中實現這一點,否則你的主程序將掛起,以檢查空閒狀態。
你可以在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();
}
}
這樣做沒有可移植的方式。你的目標是什麼系統?你對空閒的定義是什麼? – 2010-05-06 00:12:55
也許你會在這個相關問題中找到解決方案: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