32

Windows と OS X で実行する Java で書かれたサーバー風のソフトウェアがあります (サーバーではなく、通常のユーザーの PC - トレント クライアントのようなものです)。マシンがアクティブな間、マシンを起動状態に保つ (スリープ モードに入らないようにする) ために OS に送信します。

もちろん、クロスプラットフォームのソリューションがあるとは思っていませんが、アプリが生成してOSに通知して起動できる最小限のCプログラム/スクリプトがあればいいのにと思います。

何か案は?

4

18 に答える 18

39

このコードを使用して、ワークステーションがロックされないようにしています。現在、マウスを 1 分に 1 回だけ動かすように設定されていますが、簡単に調整できます。

これはハックであり、エレガントなソリューションではありません。

import java.awt.*;
import java.util.*;
public class Hal{

    public static void main(String[] args) throws Exception{
        Robot hal = new Robot();
        Random random = new Random();
        while(true){
            hal.delay(1000 * 60);
            int x = random.nextInt() % 640;
            int y = random.nextInt() % 480;
            hal.mouseMove(x,y);
        }
    }
}
于 2008-09-09T21:31:14.920 に答える
14

Windows では、SystemParametersInfo関数を使用します。これは、あらゆる種類のシステム設定を取得/設定できるスイス軍スタイルの機能です。

たとえば、画面のシャットオフを無効にするには:

SystemParametersInfo( SPI_SETPOWEROFFACTIVE, 0, NULL, 0 );

終わったら必ず元に戻してください...

于 2008-09-09T21:05:24.813 に答える
7

上記の Scarcher2 のコード スニペットに追加し、マウスを 1 ピクセルだけ移動します。マウスを 2 回動かしたので、ポインターが極端な位置にある場合でも変化が生じます。

while(true){
            hal.delay(1000 * 30);       
            Point pObj = MouseInfo.getPointerInfo().getLocation();
            System.out.println(pObj.toString() + "x>>" + pObj.x + "  y>>" + pObj.y);
            hal.mouseMove(pObj.x + 1, pObj.y + 1);  
            hal.mouseMove(pObj.x - 1, pObj.y - 1);
            pObj = MouseInfo.getPointerInfo().getLocation();
            System.out.println(pObj.toString() + "x>>" + pObj.x + "  y>>" + pObj.y);
        }
于 2012-04-23T11:59:37.700 に答える
5

私は、マウスを x 方向に 1 ポイント動かしてから 3 分ごとに戻すという非常に強引な手法を使用しています。

もっとエレガントな解決策があるかもしれませんが、それは簡単な修正です。

于 2008-09-09T20:56:17.547 に答える
5

マウスを前後に動かすすべての提案は、ユーザーを夢中にさせませんか? 隔離できるようになったらすぐに、それを行うアプリを削除することを知っています。

于 2008-09-09T23:49:08.897 に答える
3

Javaコードを生成し、コンパイルし、生成されたファイルを消去し、バックグラウンドで実行する完成したバッチファイルです..(ラップトップにはjdkが必要です)

これをBatファイルとして保存して実行するだけです。(somefilename.bat) ;)

@echo off
setlocal

rem rem if JAVA is set and run from :startapp labeled section below, else the program exit through :end labeled section.
if not "[%JAVA_HOME%]"=="[]" goto start_app
echo. JAVA_HOME not set. Application will not run!
goto end


:start_app
echo. Using java in %JAVA_HOME%
rem writes below code to Energy.java file.
@echo import java.awt.MouseInfo; > Energy.java
@echo import java.awt.Point; >> Energy.java
@echo import java.awt.Robot; >> Energy.java
@echo //Mouse Movement Simulation >> Energy.java
@echo public class Energy { >> Energy.java
@echo     public static void main(String[] args) throws Exception { >> Energy.java
@echo         Robot energy = new Robot(); >> Energy.java
@echo         while (true) { >> Energy.java
@echo             energy.delay(1000 * 60); >> Energy.java
@echo             Point pObj = MouseInfo.getPointerInfo().getLocation(); >> Energy.java
@echo             Point pObj2 = pObj;  >> Energy.java
@echo             System.out.println(pObj.toString() + "x>>" + pObj.x + "  y>>" + pObj.y); >> Energy.java
@echo             energy.mouseMove(pObj.x + 10, pObj.y + 10); >> Energy.java
@echo             energy.mouseMove(pObj.x - 10, pObj.y - 10); >> Energy.java
@echo             energy.mouseMove(pObj2.x, pObj.y); >> Energy.java
@echo             pObj = MouseInfo.getPointerInfo().getLocation(); >> Energy.java
@echo             System.out.println(pObj.toString() + "x>>" + pObj.x + "  y>>" + pObj.y); >> Energy.java
@echo         } >> Energy.java
@echo     } >> Energy.java
@echo } >> Energy.java

rem compile java code.
javac Energy.java
rem run java application in background.
start javaw Energy
echo. Your Secret Energy program is running...
goto end

:end
rem clean if files are created.
pause
del "Energy.class"
del "Energy.java"
于 2019-02-14T06:23:12.763 に答える
2

私はしばらくの間、Macのスリープモードを制御するためにpmsetを使用してきましたが、統合するのは非常に簡単です。これは、Javaからそのプログラムを呼び出してスリープモードを無効/有効にする方法の大まかな例です。pmsetを実行するにはroot権限が必要であるため、このプログラムを実行するにはroot権限が必要であることに注意してください。

import java.io.BufferedInputStream;
import java.io.IOException;

/**
 * Disable sleep mode (record current setting beforehand), and re-enable sleep
 * mode. Works with Mac OS X using the "pmset" command.
 */
public class SleepSwitch {

    private int sleepTime = -1;

    public void disableSleep() throws IOException {
        if (sleepTime != -1) {
            // sleep time is already recorded, assume sleep is disabled
            return;
        }

        // query pmset for the current setting
        Process proc = Runtime.getRuntime().exec("pmset -g");
        BufferedInputStream is = new BufferedInputStream(proc.getInputStream());
        StringBuffer output = new StringBuffer();
        int c;
        while ((c = is.read()) != -1) {
            output.append((char) c);
        }
        is.close();

        // parse the current setting and store the sleep time
        String outString = output.toString();
        String setting = outString.substring(outString.indexOf(" sleep\t")).trim();
        setting = setting.substring(7, setting.indexOf(" ")).trim();
        sleepTime = Integer.parseInt(setting);

        // set the sleep time to zero (disable sleep)
        Runtime.getRuntime().exec("pmset sleep 0");
    }

    public void enableSleep() throws IOException {
        if (sleepTime == -1) {
            // sleep time is not recorded, assume sleep is enabled
            return;
        }

        // set the sleep time to the previously stored value
        Runtime.getRuntime().exec("pmset sleep " + sleepTime);

        // reset the stored sleep time
        sleepTime = -1;
    }
}
于 2008-09-10T01:21:27.927 に答える
2

OS X では、 spawn だけcaffeinateです。caffeinateこれにより、が終了するまでシステムがスリープ状態になりません。

于 2015-05-18T21:46:16.960 に答える
2

プログラム Caffeine caffieneを使用して、ワークステーションを起動しておくことができます。OS X で open コマンドを使用してプログラムを実行できます。

于 2008-09-18T15:32:14.180 に答える
2

Visual Studio で簡単なフォームを作成します。ツールバーから、Timer コントロールをフォームにドラッグします。Init コードで、タイマー間隔を 60 秒 (60000 ミリ秒) に設定します。次のコード「SendKeys.Send("{F15}");」でタイマー コールバックを実装します。新しいプログラムを実行します。

マウスの移動は必要ありません。

編集: 少なくとも私の軍用ワークステーションでは、単にプログラムでマウスとキー メッセージを生成するだけでは、ワークステーションをログインして起動したままにするのに十分ではありません。Java Robot クラスの初期のポスターは正しい方向に進んでいます。JAVA ロボットは OS の HAL (ハードウェア アブストラクション レイヤー) 上または下で動作しますが、コードに Robot.keyPress(123) を追加するまで、Java/ロボット ソリューションを再作成してテストしましたが、動作しませんでした。

于 2015-07-02T19:01:14.170 に答える
1

このコードは、ユーザーが違いに気付かないように、ポインターを既にある同じ場所に移動します。

while (true) {
    Thread.sleep(180000);//this is how long before it moves
    Point mouseLoc = MouseInfo.getPointerInfo().getLocation();
    Robot rob = new Robot();
    rob.mouseMove(mouseLoc.x, mouseLoc.y);
}
于 2013-10-13T19:00:41.207 に答える
1

サーバーの電源管理を無効にする方が簡単ではないでしょうか? サーバーが省電力モードに入るべきではないと主張するかもしれませんか?

于 2008-09-09T20:55:21.030 に答える
1

JNA を使用する Windows 用のユーザー Gili によって提供されたソリューションを使用するには、MacOS 用の JNA ソリューションを次に示します。

まず、JNA ライブラリ インターフェイス:

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.platform.mac.CoreFoundation;
import com.sun.jna.ptr.IntByReference;

public interface ExampleIOKit extends Library {
    ExampleIOKit INSTANCE = Native.load("IOKit", ExampleIOKit.class);

    CoreFoundation.CFStringRef kIOPMAssertPreventUserIdleSystemSleep = CoreFoundation.CFStringRef.createCFString("PreventUserIdleSystemSleep");
    CoreFoundation.CFStringRef kIOPMAssertPreventUserIdleDisplaySleep = CoreFoundation.CFStringRef.createCFString("PreventUserIdleDisplaySleep");

    int kIOReturnSuccess = 0;

    int kIOPMAssertionLevelOff = 0;
    int kIOPMAssertionLevelOn = 255;

    int IOPMAssertionCreateWithName(CoreFoundation.CFStringRef assertionType,
                                    int assertionLevel,
                                    CoreFoundation.CFStringRef reasonForActivity,
                                    IntByReference assertionId);

    int IOPMAssertionRelease(int assertionId);
}

JNA メソッドを呼び出してスリープ防止をオンまたはオフにする例を次に示します。

public class Example {
    private static final Logger _log = LoggerFactory.getLogger(Example.class);

    private int sleepPreventionAssertionId = 0;

    public void updateSleepPrevention(final boolean isEnabled) {
        if (isEnabled) {
            if (sleepPreventionAssertionId == 0) {
                final var assertionIdRef = new IntByReference(0);
                final var reason = CoreFoundation.CFStringRef.createCFString(
                    "Example preventing display sleep");
                final int result = ExampleIOKit.INSTANCE.IOPMAssertionCreateWithName(
                    ExampleIOKit.kIOPMAssertPreventUserIdleDisplaySleep,
                    ExampleIOKit.kIOPMAssertionLevelOn, reason, assertionIdRef);
                if (result == ExampleIOKit.kIOReturnSuccess) {
                    _log.info("Display sleep prevention enabled");
                    sleepPreventionAssertionId = assertionIdRef.getValue();
                }
                else {
                    _log.error("IOPMAssertionCreateWithName returned {}", result);
                }
            }
        }
        else {
            if (sleepPreventionAssertionId != 0) {
                final int result = ExampleIOKit.INSTANCE.IOPMAssertionRelease(sleepPreventionAssertionId);
                if (result == ExampleIOKit.kIOReturnSuccess) {
                    _log.info("Display sleep prevention disabled");
                }
                else {
                    _log.error("IOPMAssertionRelease returned {}", result);
                }
                sleepPreventionAssertionId = 0;
            }
        }
    }
}
于 2021-05-07T22:11:40.833 に答える
0

サーバーにpingを実行するなど、タイマー内でコマンドを実行します..

于 2008-09-09T20:54:07.460 に答える
0

マウスを動かす機能を実行する (または景品アプリをダウンロードする) だけです。エレガントではありませんが、簡単です。

于 2008-09-09T21:08:41.277 に答える
-1

「Windows デスクトップの自動ロック」を回避するために使用する簡単な方法の 1 つは、6 秒ごとに「NumLock のオン/オフを切り替える」ことです。

NumLock の ON/OFF を切り替える Java プログラムです。

import java.util.*;
import java.awt.*;
import java.awt.event.*;

public class NumLock extends Thread {
  public void run() {
    try {
    boolean flag = true;
    do {
        flag = !flag;

        Thread.sleep(6000);
        Toolkit.getDefaultToolkit().setLockingKeyState(KeyEvent. VK_NUM_LOCK, flag);
    }
    while(true);
    }
    catch(Exception e) {}
  }

  public static void main(String[] args) throws Exception {
    new NumLock().start();
  }
}

この Java プログラムを別のコマンド プロンプトで実行します。:-)

于 2019-05-15T10:15:43.257 に答える