我有一个用 Java 编写的服务器软件,可以在 Windows 和 OS X 上运行。(它不是在服务器上运行,而是在普通用户的 PC 上运行 - 类似于 torrent 客户端。)我希望软件向操作系统发出信号,以保持机器唤醒(防止其进入睡眠模式)。积极的。

当然,我不希望有跨平台解决方案,但我希望有一些非常小的 C 程序/脚本,我的应用程序可以生成这些程序/脚本来通知操作系统保持唤醒状态。

有任何想法吗?

有帮助吗?

解决方案

我使用此代码来防止我的工作站锁定。目前仅设置为每分钟移动一次鼠标,但您可以轻松调整它。

这是一个 hack,而不是一个优雅的解决方案。

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

完成后请务必将其设置回来...

我有一个非常强力的技术,将鼠标在 x 方向上移动 1 点,然后每 3 分钟返回一次。

我可能有一个更优雅的解决方案,但这是一个快速修复。

添加到上面 scraper2 的代码片段并将鼠标仅移动 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);
        }

所有来回移动鼠标的建议难道不会让用户发疯吗?我知道一旦我可以隔离任何会执行此操作的应用程序,我就会将其删除。

禁用服务器上的电源管理不是更容易吗?可能有人会说服务器不应该进入省电模式?

我一直在使用 时间设定 现在可以控制我的 Mac 上的睡眠模式一段时间,并且集成起来非常容易。下面是一个粗略的示例,说明如何从 Java 调用该程序来禁用/启用睡眠模式。请注意,您需要 root 权限才能运行 pmset,因此您需要它们来运行该程序。

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

您可以使用咖啡因程序 咖啡因 让您的工作站保持清醒。您可以通过 os X 中的 open 命令运行该程序。

在 Visual Studio 中创建一个简单的表单。从工具栏中将 Timer 控件拖到窗体上。在初始化代码中,将计时器间隔设置为 60 秒(60000 毫秒)。用以下代码“ sendkeys.send(“ {f15}”);”实现计时器回调;”运行新程序。

无需移动鼠标。

编辑:至少在我的陆军工作站上,简单地以编程方式生成鼠标和按键消息不足以让我的工作站保持登录和唤醒状态。Java Robot 类的早期海报是在正确的轨道上。JAVA Robot 在操作系统的 HAL(硬件抽象层)之上或之下工作,但是我重新创建并测试了 Java/Robot 解决方案,但它不起作用 - 直到我将 Robot.keyPress(123) 添加到代码中。

在计时器内运行命令,例如 ping 服务器。

我只是做一个移动鼠标的功能(或下载免费应用程序)。不优雅,但很简单。

此代码将指针移动到原来所在的位置,以便用户不会注意到任何差异。

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 桌面自动锁定”的一种简单方法是每 6 秒“打开/关闭 NumLock”。

这是一个用于打开/关闭 NumLock 的 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 程序;:-)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top