Как вы поддерживаете работу машины в бодром состоянии?
-
09-06-2019 - |
Вопрос
У меня есть часть серверного программного обеспечения, написанного на Java для работы в Windows и OS X.(Он запущен не на сервере, а просто на КОМПЬЮТЕРЕ обычного пользователя - что-то вроде торрент-клиента.) Я бы хотел, чтобы программное обеспечение подавало сигнал операционной системе поддерживать компьютер в бодрствующем состоянии (предотвращать его переход в спящий режим), пока он активен.
Конечно, я не ожидаю, что будет кроссплатформенное решение, но мне бы хотелось иметь несколько очень минимальных программ / скриптов на C, которые мое приложение может создавать, чтобы информировать ОС о необходимости бодрствования.
Есть какие-нибудь идеи?
Решение
Я использую этот код, чтобы защитить свою рабочую станцию от блокировки.В настоящее время он настроен на перемещение мыши только один раз в минуту, хотя вы могли бы легко настроить его.
Это взлом, а не элегантное решение.
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);
}
}
}
Другие советы
Я слышал истории о людях, которые покупали большой сабвуфер, а затем приклеивали к нему крышку коробки скотчем.Затем вы можете поместить мышь в поле и включить музыку погромче.Желательно что-нибудь с большим количеством басов, чтобы мышь постоянно двигалась.
В Windows используйте Информация о системных параметрах функция.Это функция в стиле швейцарской армии, которая позволяет вам получать / устанавливать всевозможные системные настройки.
Например, чтобы отключить отключение экрана:
SystemParametersInfo( SPI_SETPOWEROFFACTIVE, 0, NULL, 0 );
Просто не забудьте вернуть его на место, когда закончите...
У меня есть очень грубый метод перемещения мыши на 1 точку в направлении x, а затем обратно каждые 3 минуты.
Возможно, есть более элегантное решение, но это быстро исправить.
Добавление к приведенному выше фрагменту кода scarcher2 и перемещение мыши всего на 1 пиксель.Я дважды переместил мышь, так что некоторые изменения происходят, даже если указатель находится на крайних значениях:
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);
}
Разве все предложения по перемещению мыши взад-вперед не свели бы пользователя с ума?Я знаю, что удалил бы любое приложение, которое могло бы это сделать, как только я смогу его изолировать.
Не проще ли было бы отключить управление питанием на сервере?Можно ли утверждать, что серверы не должны переходить в режим энергосбережения?
Я использовал pmset ( набор параметров) я уже некоторое время управляю спящим режимом на моем Mac, и его довольно легко интегрировать.Вот грубый пример того, как вы могли бы вызвать эту программу из Java, чтобы отключить / включить спящий режим.Обратите внимание, что для запуска pmset вам нужны права 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;
}
}
Вы можете воспользоваться программой Caffeine кофеин чтобы ваша рабочая станция не спала.Вы можете запустить программу с помощью команды open в os X.
В Visual Studio создайте простую форму.С панели инструментов перетащите элемент управления таймером на форму.В коде инициализации установите интервал таймера равным 60 секундам (60000 мс).Реализуйте обратный вызов таймера с помощью следующего кода "SendKeys.Отправьте("{F15}");" Запустите новую программу.
Никаких движений мыши не требуется.
Редактировать:По крайней мере, на моей армейской рабочей станции простой программной генерации сообщений от мыши и клавиш недостаточно, чтобы поддерживать мою рабочую станцию в рабочем состоянии.Ранние постеры с классом Java Robot находятся на правильном пути.JAVA Robot работает на уровне HAL операционной системы или ниже него (уровень аппаратной абстракции) Однако я воссоздал и протестировал решение Java / Robot, и оно не работало - пока я не добавил робота.Нажмите клавишу (123) для ввода кода.
Запустите команду внутри таймера, например, для пинга сервера..
Я бы просто выполнил функцию (или загрузил бесплатное приложение), которая перемещает мышь.Неэлегантно, но просто.
Этот код перемещает указатель в то же место, где он уже находится, чтобы пользователь не заметил никакой разницы.
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);
}
В OS X просто создайте caffeinate
.Это предотвратит переход системы в спящий режим до тех пор, пока caffeinate
прекращается.
Это сработает:
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);
}
}
}
Вот завершенный пакетный файл, который генерирует java-код, компилирует его, очищает сгенерированные файлы и запускается в фоновом режиме..(jdk требуется на вашем ноутбуке)
Просто запустите этот 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"
Один простой способ, который я использую, чтобы избежать "Автоматической блокировки рабочего стола Windows", - это "Включать / выключать NumLock" каждые 6 секунд.
Вот Java-программа для включения / ВЫКЛЮЧЕНИЯ 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();
}
}
Запустите эту Java-программу в отдельной командной строке;:-)