6

这是一个相当棘手的问题,因为我在网上没有找到任何信息。基本上,我想知道如何检查计算机是否在 Java 中处于空闲状态。我希望一个程序只有在计算机处于活动状态时才能工作,但如果它是空闲的,那么就不会。

我能想到的唯一方法是连接鼠标/键盘并设置一个计时器。

MSN Messenger 具有“离开”功能,我希望有类似的功能。

4

5 回答 5

2

Java 无法在应用程序之外的系统级别与键盘或鼠标进行交互。

话虽如此,这里有几种在 Windows 中执行此操作的方法。最简单的可能是设置JNI和poll

获取最后输入信息

用于键盘和鼠标活动。

于 2010-05-06T00:27:41.950 回答
1

我不是专业人士,但我有一个想法:

您可以使用 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 坐标),这意味着系统处于空闲状态,您可以继续随心所欲地采取行动(希望这是您要实施的合法活动:-)

请务必在新线程中实现,否则您的主程序将挂起以检查空闲状态。

于 2010-12-25T00:30:59.830 回答
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();
    }
}
于 2012-02-15T09:53:00.347 回答
0

独立于平台的 JRE 中没有任何内容可以回答这个问题。您可能可以通过测量时钟时间进行计算来猜测,但这并不可靠。在特定平台上,可能有供应商 API 可以帮助您。

于 2010-05-06T00:24:23.900 回答
-1

1)创建一个新线程。

2)给它一个超超低优先级(你可以的最低)

3)每隔一两秒,让线程做一些简单的任务。如果超快,至少有 1 个 CPU 处于空闲状态。如果它变慢了,那么至少有 1 个核心不会闲置。

或者

只需以低优先级运行您的程序。这将使操作系统处理让其他程序在您的程序上运行的问题。

于 2010-05-06T02:10:02.197 回答