6

オンラインで情報が見つからないため、これはかなり難しい質問です。基本的に、コンピューターが Java でアイドル状態かどうかを確認する方法を知りたいです。コンピューターがアクティブに使用されている場合にのみプログラムが機能し、アイドル状態の場合は機能しないことを望みます。

これを行う唯一の方法は、マウス/キーボードに接続してタイマーを使用することです。

MSN Messenger にはその「不在」機能があります。これに似た機能が欲しいと思います。

4

5 に答える 5

2

Java には、アプリケーションの外部のシステム レベルでキーボードやマウスとやり取りする方法がありません。

ここで言われていることは、 Windows でそれを行ういくつかの方法です。最も簡単なのは、おそらく JNI をセットアップしてポーリングすることです

GetLastInputInfo

キーボードとマウスのアクティビティ用。

于 2010-05-06T00:27:41.950 に答える
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 に答える
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+")");
        }
    }
}

printステートメントをロジックに置き換えます。たとえば、1分間、マウスの過去の位置が新しい位置と同じであるとします(単にx座標のみを比較できます)。これは、システムがアイドル状態であることを意味し、続行できますあなたが望むようにあなたの行動で(うまくいけば、それはあなたが実装したい合法的な活動です:-)

これを必ず新しいスレッドで実装してください。そうしないと、アイドル状態をチェックするためにメイン プログラムがハングします。

于 2010-12-25T00:30:59.830 に答える
0

プラットフォームに依存しない JRE には、この質問に答えるものはありません。計算のために時計の時間を測定することで推測できるかもしれませんが、信頼できるものではありません。特定のプラットフォームでは、役立つベンダー API が存在する場合があります。

于 2010-05-06T00:24:23.900 に答える
-1

1) 新しいスレッドを作成します。

2) 超超低優先度 (できる限り低い優先度) を付けます。

3) 1 秒または 2 秒ごとに、スレッドに単純なタスクを実行させます。超高速の場合、少なくとも 1 つの CPU がかなりアイドル状態です。遅い場合は、少なくとも 1 つのコアがアイドル状態ではありません。

または

プログラムを低い優先度で実行するだけです。これにより、OS は他のプログラムをあなたのプログラム上で実行できるようになります。

于 2010-05-06T02:10:02.197 に答える