院長のメモ帖
2013年2月 2日 土曜日
Connected StandbyはDisplayRequiredで阻止できる
前回、Windows 8 のConnected StandbyをSetThreadExecutionStateメソッドで止めることができないと書きましたが、やり方がわかりました。
それには、SetThreadExecutionStateメソッドの引数にDisplayRequiredを渡すせば良かったのです。
Windows 7までは、SystemRequiredを渡すとスリープが止まり、DisplayRequiredを渡すとディスプレイの電源OFFを止めることができましたが、Connected StandbyではSystemRequiredは無意味になっているようです。
これに気が付いたのは、コントロールパネルの電源オプションのプラン設定の編集画面を見ているときです。
Windows7では、
Windows 8では、
よくみると、ディスプレイの電源を切る → ディスプレイを暗くする に変更されています。そして詳細の変更に入ると、スリープという項目はなくなっています。
つまり、ディスプレイを暗くするという項目が新設されて、簡易設定画面でスリープ状態にするといっているのは、今までのディスプレイの電源を切るに相当する項目であるということです。
それゆえ、DisplayRequiredをパラメーターに指定するとスリープしなくなったと推測されます。
これは、結構盲点になりそうな変更ですね。OSから見てディスプレイが切れた状態で、デスクトップアプリはスリープに陥るというのは、バッテリーには優しくなる変更でしょうが、一部のアプリが正しく動かなくなるかもしれませんね。
2013年2月 1日 金曜日
Connected StandbyはSetThreadExecutionStateで阻止できない
<追記>
SetThreadExecutionStateにSystemRequiredではなくDisplayRequiredを渡すとConnected Standbyを阻止できました。詳しくはこちらで。
最近、富士通のWindows8防水タブレット、Arrows Tab Wifi QH55を購入しました。このタブレットは、Windows8パソコンとしては最軽量クラスで、しかもお風呂で使えるということで非常に重宝しています。そのうちレビューしようかなと思っていたんですが、自作のプログラムを走らせていてあることに気が付きました。それは、このPCのスリープは、SetThreadExecutionStateメソッドで阻止できないことです。
動作中はスリープしないプログラムを自作していたのですが、Arrows Tabでは、スリープしてしまいます。そこで、Microsoft.Win32.SystemEvents.PowerModeChangedイベントをフックして、電源モードの変化を記録してたうえでスリープボタンを押してみると、他のPCではスリープレジュームイベントが記録されるのに、Arrows Tabでは、このイベントが発生していませんでした。
このPCはWindows8で新しく実装されたConnected Standbyに対応していて、いままでのS3, S4ではなくS0i1、S0i3という待機状態になります。この状態ではOSは動いていてるままだそうです。推測ですが、この状態への移行は今までのスリープとは内部的な動作が全く違うので、ExecutionStateは参照されないと思われます。
Connected Standbyを阻止するには、今まで違うコードが必要なようで、いろいろ調べてみるしかなさそうですね。
SetThreadExecutionStateにSystemRequiredではなくDisplayRequiredを渡すとConnected Standbyを阻止できました。詳しくはこちらで。
最近、富士通のWindows8防水タブレット、Arrows Tab Wifi QH55を購入しました。このタブレットは、Windows8パソコンとしては最軽量クラスで、しかもお風呂で使えるということで非常に重宝しています。そのうちレビューしようかなと思っていたんですが、自作のプログラムを走らせていてあることに気が付きました。それは、このPCのスリープは、SetThreadExecutionStateメソッドで阻止できないことです。
動作中はスリープしないプログラムを自作していたのですが、Arrows Tabでは、スリープしてしまいます。そこで、Microsoft.Win32.SystemEvents.PowerModeChangedイベントをフックして、電源モードの変化を記録してたうえでスリープボタンを押してみると、他のPCではスリープレジュームイベントが記録されるのに、Arrows Tabでは、このイベントが発生していませんでした。
このPCはWindows8で新しく実装されたConnected Standbyに対応していて、いままでのS3, S4ではなくS0i1、S0i3という待機状態になります。この状態ではOSは動いていてるままだそうです。推測ですが、この状態への移行は今までのスリープとは内部的な動作が全く違うので、ExecutionStateは参照されないと思われます。
Connected Standbyを阻止するには、今まで違うコードが必要なようで、いろいろ調べてみるしかなさそうですね。