【问题标题】:Setting windows to energy save mode using Node.js使用 Node.js 将窗口设置为节能模式
【发布时间】:2016-05-10 17:05:21
【问题描述】:

我正在使用 Electron 和 Node.js 开发一个应用程序,并且应该在需要时将笔记本电脑(运行 Windows 10)设置为节能模式,这可以使用 Node.js 和 Electron 的技术来实现吗?谢谢

【问题讨论】:

    标签: node.js electron


    【解决方案1】:

    您可以使用 node-ffi 库调用 WinAPI 函数 SetSuspendState

    首先,安装库:

    npm install ffi --save
    

    然后,您可以使用以下代码:

    var ffi = require('ffi');
    var powrprof = ffi.Library('powrprof.dll', {
        SetSuspendState: ['int', ['int', 'int', 'int']]
    });
    
    function invokeStandby() {
        powrprof.SetSuspendState(0, 0, 0);
    }
    

    请注意,这会进行正常待机并保持唤醒事件开启。如果要禁用唤醒事件,请使用 powrprof.SetSuspendState(0, 0, 1)(第三个参数 1 而不是 0)。详情请参阅docs


    更新:请注意,如果您认为使用rundll32 是一个不错的快捷方式,那么您会得到奇怪的行为,具体取决于计算机设置,可能还有天气和星期几(如- 未定义的行为),因为rundll32 不只是按照您的想法运行任意 DLL 函数。请参阅 this articlerundll32 docs。调用rundll32 powrprof.dll,SetSuspendState 0,0,0 可能会使您的计算机进入睡眠状态,但它可能会在另一台计算机上执行其他操作,例如休眠而不是调用待机模式(或者理论上甚至崩溃)。所以,不要这样做!

    【讨论】:

      【解决方案2】:

      我想出了一个不需要额外库的想法。

      var exec = require('child_process').exec;
      exec('rundll32.exe powrprof.dll,SetSuspendState 0,0,0');
      

      这个函数只是生成一个调用rundll32.exe的shell,所以我们可以直接执行带有所需参数的函数SetSuspendState

      希望对你有帮助

      【讨论】:

      • 请注意,这是不正确的! rundll32 不能调用任意DLL函数!事实上,0,0,0 的作用不是你所期望的,而是将意外的垃圾传递给函数,因为rundll32 的调用约定非常具体并发送四个参数:(HWND hwnd, HINSTANCE hinst, LPSTR pszCmdLine, int nCmdShow),其中pszCmdLine 是一个指向命令行的字符串指针。如此有效地调用SetSuspendState(0xABCDE, 0x10000000, "0, 0, 0", 0);(用C 术语)之类的东西,这绝对是不正确的,很可能会使PC 休眠(如果休眠是打开的)
      • 有关更多详细信息,请参阅blogs.msdn.microsoft.com/oldnewthing/20040115-00/?p=41043(向下滚动到“Rundll32.exe 入口点”)或 Raymond 添加到this 评论的答案。
      • 另请参阅 Microsoft 的 rundll32 文档:support.microsoft.com/en-us/kb/164787
      • 感谢您指出这一点。我知道rundll32 的存在,但从未查看过它的文档。我遇到了一些做同样事情的帖子,所以我对这个 exe 有错误的想法
      • 更新了我在上面链接的评论的链接:web.archive.org/web/20181011035708/https://…
      猜你喜欢
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多