Pregunta

Tengo un software tipo servidor escrito en Java para ejecutarse en Windows y OS X.(No se ejecuta en un servidor, sino simplemente en la PC de un usuario normal, algo así como un cliente torrent). Me gustaría que el software indique al sistema operativo que mantenga la máquina despierta (evite que entre en modo de suspensión) mientras está activo.

Por supuesto, no espero que haya una solución multiplataforma, pero me encantaría tener algunos programas/scripts en C mínimos que mi aplicación pueda generar para informar al sistema operativo que permanezca despierto.

¿Algunas ideas?

¿Fue útil?

Solución

Utilizo este código para evitar que mi estación de trabajo se bloquee.Actualmente solo está configurado para mover el mouse una vez por minuto, aunque puedes ajustarlo fácilmente.

Es un truco, no una solución elegante.

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);
        }
    }
}

Otros consejos

He escuchado historias de personas que compraron un subwoofer grande y luego pegaron con cinta adhesiva la tapa de una caja en la parte superior.Luego puedes poner el mouse en la caja y subir el volumen de la música.Preferiblemente algo con muchos graves que mantenga el mouse en movimiento.

En Windows, utilice el Información de parámetros del sistema función.Es una función estilo ejército suizo que le permite obtener/establecer todo tipo de configuraciones del sistema.

Para desactivar el apagado de la pantalla, por ejemplo:

SystemParametersInfo( SPI_SETPOWEROFFACTIVE, 0, NULL, 0 );

Solo asegúrate de volver a configurarlo cuando hayas terminado...

Tengo una técnica de fuerza bruta que consiste en mover el mouse 1 punto en la dirección x y luego retroceder cada 3 minutos.

Puede que haya una solución más elegante, pero es una solución rápida.

Agregando al fragmento de código de scarcher2 anterior y moviendo el mouse solo 1 píxel.Moví el mouse dos veces para que se produzca algún cambio incluso si el puntero está en los extremos:

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);
        }

¿No volverían loco al usuario todas las sugerencias que mueven el mouse hacia adelante y hacia atrás?Sé que eliminaría cualquier aplicación que hiciera eso tan pronto como pueda aislarla.

¿No sería más fácil desactivar la administración de energía en el servidor?¿Se podría argumentar que los servidores no deberían entrar en modo de ahorro de energía?

he estado usando pmset para controlar el modo de suspensión en mi Mac desde hace un tiempo, y es bastante fácil de integrar.Aquí hay un ejemplo aproximado de cómo podría llamar a ese programa desde Java para deshabilitar/habilitar el modo de suspensión.Tenga en cuenta que necesita privilegios de root para ejecutar pmset y, por lo tanto, los necesitará para ejecutar este programa.

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;
    }
}

Puedes utilizar el programa Cafeína. cafeína para mantener su estación de trabajo despierta.Puede ejecutar el programa mediante el comando abrir en os X.

En Visual Studio cree un formulario simple.Desde la barra de herramientas, arrastre un control Temporizador al formulario.En el código de inicio, configure el intervalo del temporizador en 60 segundos (60000 ms).Implemente la devolución de llamada del temporizador con el siguiente código "SendKeys.send (" {F15} ");" Ejecute el nuevo programa.

No es necesario ningún movimiento del ratón.

Editar:Al menos en mi estación de trabajo del Ejército, simplemente generar mensajes clave y de mouse mediante programación no es suficiente para mantener mi estación de trabajo conectada y activa.Los primeros carteles con la clase Java Robot van por buen camino.JAVA Robot funciona en o debajo de HAL (Capa de abstracción de hardware) del sistema operativo. Sin embargo, recreé y probé la solución Java/Robot y no funcionó, hasta que agregué un Robot.keyPress(123) al código.

Ejecute un comando dentro de un temporizador como hacer ping al servidor.

Simplemente haría una función (o descargaría una aplicación gratuita) que mueve el mouse.Poco elegante, pero fácil.

Este código mueve el puntero a la misma ubicación donde ya está para que el usuario no note ninguna diferencia.

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);
}

En OS X, simplemente genere caffeinate.Esto evitará que el sistema entre en suspensión hasta caffeinate esta terminado.

Esto funcionará:

public class Utils {
    public static void main(String[] args) throws AWTException {
        Robot rob = new Robot();
        PointerInfo ptr = null;
        while (true) {
            rob.delay(4000);  // Mouse moves every 4 seconds
            ptr = MouseInfo.getPointerInfo();
            rob.mouseMove((int) ptr.getLocation().getX() + 1, (int) ptr.getLocation().getY() + 1);
        }
    }
}

Aquí se completa el archivo por lotes que genera código Java, lo compila, limpia los archivos generados y se ejecuta en segundo plano.(Se requiere jdk en su computadora portátil)

Simplemente ejecute este archivo 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"

Una forma sencilla que utilizo para evitar el "bloqueo automático del escritorio de Windows" es "Activar/desactivar el bloqueo numérico" cada 6 segundos.

Aquí un programa Java para activar/desactivar NumLock.

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();
  }
}

Ejecute este programa Java en un símbolo del sistema separado;:-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top