2016-05-04 3 views

答えて

4

ライブラリを使用してWinAPI関数SetSuspendStateを呼び出すことができます。

まず、ライブラリをインストール:これは通常の待機を行い、葉が上のイベントを覚ますこと

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

function invokeStandby() { 
    powrprof.SetSuspendState(0, 0, 0); 
} 

注:その後

npm install ffi --save 

を、あなたはこのコードを使用することができます。ウェイクイベントを無効にする場合は、powrprof.SetSuspendState(0, 0, 1)(0ではなく3番目のパラメータ1)を使用します。詳細については、docsを参照してください。


UPDATE:あなたは素敵なショートカットがrundll32を使用することだろうと思うなら、あなたは(のように、おそらくコンピュータの設定や天候や曜日に応じて、奇妙な動作を取得することに注意してください - 未定義の動作)、なぜならrundll32はあなたが思うように任意のDLL関数を実行するだけではないからです。 this articleおよびrundll32 docsを参照してください。 rundll32 powrprof.dll,SetSuspendState 0,0,0を呼び出すと、コンピュータがスリープ状態になることがありますが、スタンバイモードを起動する代わりに、休止状態などの別のコンピュータで何かが起きる可能性があります(または理論的にはクラッシュ)。だから、これをしないでください!

0

私は、追加のライブラリを必要としないアイデアを思いついた。私たちが直接必要なパラメータを持つ関数SetSuspendStateを実行することができるように

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

この関数は、単にシェル呼び出します。rundll32.exeを生成します。

希望します。

+1

これは間違いです。 'rundll32'は任意のDLL関数を呼び出すことができません!実際には、 '0,0,0'はあなたが期待するものではありません。代わりに予期しないガベージを関数に渡します。なぜなら、' rundll32'の呼び出し規約は非常に特殊で、4つのパラメータを送信するからです。 '(HWND hwnd、HINSTANCE hinst、LPSTR pszCmdLine、int nCmdShow) '、' pszCmdLine'はコマンドラインへの文字列ポインタです。そのため、実際には正しく動作しない可能性があります(ハイバネーションがオンの場合)PCを休止状態にする可能性が高い 'SetSuspendState(0xABCDE、0x10000000、" 0、0、0 "、0);' – CherryDT

+0

詳細については、https://blogs.msdn.microsoft.com/oldnewthing/20040115-00/?p=41043(「Rundll32.exeのエントリポイント」までスクロールしてください)、またはレイモンドさんが[this]に追加した回答https://blogs.msdn.microsoft.com/oldnewthing/20070607-00/?p=26523#comment-512403)comment。 – CherryDT

+0

Microsoftの 'rundll32'のドキュメントも参照してください:https://support.microsoft.com/en-us/kb/164787 – CherryDT

関連する問題