这是一个相当棘手的问题,因为我没有在网上找到任何信息。基本上,我想知道如何检查计算机是否在Java中空闲。我希望程序只有在计算机处于活动状态时才能工作,但是如果它处于空闲状态则不行。
我能想到这样做的唯一方法是挂钩鼠标/键盘并有一个计时器。
MSN Messenger具有“远离”功能,我希望有类似的东西。
答案 0 :(得分:2)
Java无法在应用程序之外的系统级别与键盘或鼠标进行交互。
That being said here are several ways to do it in Windows。最简单的可能是设置JNI和民意调查
GetLastInputInfo
用于键盘和鼠标活动。
答案 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+")");
}
}
}
用您的逻辑替换print语句,就像在某个时间段内说1分钟鼠标的过去位置与新位置相同(您只能比较x坐标),这意味着系统处于空闲状态,并且你可以按照自己的意愿继续行动(希望这是你想要实施的法律活动:-)
确保在新线程中实现此功能,否则主程序将挂起以检查空闲状态。
答案 2 :(得分: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();
}
}
答案 3 :(得分:0)
平台无关的JRE中没有任何内容可以回答这个问题。您可以通过测量计算的时钟时间来猜测,但它不可靠。在特定平台上,可能存在可能对您有所帮助的供应商API。
答案 4 :(得分:0)
1)创建一个新帖子。
2)给它一个超级超低优先级(你能尽可能低)
3)每隔一两步,让线程做一些简单的任务。如果超快,至少有1个CPU空闲。如果它变慢,那么至少有一个核心不会空闲。
或者
只需以低优先级运行您的程序。这将让操作系统处理让其他程序在你的程序上运行。