用Java让Windows休眠

5
有没有在Java中使用的命令让Windows计算机进入睡眠状态?

已删除 hibernate 标签,因为它指的是 ORM。 - Spencer Ruport
6个回答

10

如果您的Java应用程序有足够的权限,可以通过执行shell命令来实现。 命令是...

Runtime.getRuntime().exec("Rundll32.exe powrprof.dll,SetSuspendState Sleep");

您可以在这里找到该命令和其他命令的显示。


1
即使原帖作者接受了这个答案,未来的读者也应该查看https://dev59.com/hUnSa4cB1Zd3GeqPLi2m#1369832。 - Trevor Harrison

8

我目前使用https://github.com/twall/jna解决了这个问题。有关从http://www.pinvoke.net/default.aspx/powrprof.SetSuspendState调用的信息。

import com.sun.jna.Native;
import com.sun.jna.Platform;
public class WindowsSuspend {
  public static native boolean SetSuspendState(boolean hibernate, boolean forceCritical, boolean disableWakeEvent);

  static {
    if (Platform.isWindows())
      Native.register("powrprof");
  }
}

使用 WindowsSuspend.SetSuspendState(false, false, false) 函数可以实现此操作。


5

建议使用rundll32的人应该被开除,很少有函数是设计为由rundll32调用的,而SetSuspendState不是其中之一。你会得到随机的行为(休眠 vs 待机和强制 vs 非强制等),详见此博客文章


1
为什么对这个答案如此厌恶?它看起来很周到和有帮助。至少在你给出负评时留下评论。 - Trevor Harrison
好的。所以,RunDLL32进程在调用函数后会出现堆栈损坏的情况。谁在乎呢?它无法“感染”父进程,并且在发生这种情况时,函数已经被调用了。 - Jherico
@Jherico:不,那不是问题所在,问题在于你将会使用未知的参数来调用SetSuspendState函数,而由于SetSuspendState函数根据参数来决定是休眠还是待机,这就有些棘手了。 - Anders
@Jherico:另外,如果您查看您发布的文章,您会注意到他们告诉您禁用/启用系统范围内的休眠来“治愈”未知/随机参数问题。 - Anders
阅读博客文章,但不理解。什么是正确的方法? - turbanoff
显示剩余3条评论

0
不行。您需要通过Runtime.exec()执行单独的二进制文件。 这篇文章建议。
rundll32 Powrprof.dll,SetSuspendState 

但我还没有尝试过。


0

您可能想要查看OnNow/ACPI支持这里

还有一个旧的SO帖子谈论它在这里。可能与您想要的相反。但可能会给您一些线索。


0
一个稍微复杂一些的方法是使用ProcessBuilder来创建一个shell脚本(.sh.bat),然后执行它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接