読者です 読者をやめる 読者になる 読者になる

InstantGo対応Windowsタブレットで、画面オフの状態で裏でデスクトップアプリを動作をさせる

# 8月ごろに調べてエントリを書こうとしてたものなので、12月現在何かもっといい方法があれば教えてほしい

はじめに

InstantGoについての基本
http://win-tab.net/misc/instantgo/
http://ascii.jp/elem/000/000/872/872162/

検証機:VivoTab note 8

要求

普通のPCで、数十分ぐらい時間のかかる処理をさせて放置しておきたい場合、ディスプレイの電源ぐらいは切っておきたいですね。Dropboxの初期同期とか、Visual Studioのインストールとか。
ノートPCだと放熱などもあるので尚更そうしたい、タブレットならさらに尚更ですね。

しかしInstantGoに対応したタブレットでは、処理を動かしたままディスプレイのみを切るという操作は標準では見当たらず、スリープ(Connected Standby)・シャットダウンしかとれる操作がない。
つまり画面オフの状態ではデスクトップアプリの処理は停止してしまい不便。なんとかしたい。*1
消費電力の都合もあるので、デフォルトがこの挙動なのは好ましいが、抜け道も用意してほしい。

探した結果

以前のWindowsからのMonitor OffのAPIを叩いていると思われるソフトウェア(nircmd monitor off など)を実行すると、Connected Standby状態に入ってしまう。 従来のモニタオフに相当する操作が、全てConnected Standbyへの移行に置き換えられているようだった。
確かにスタンバイ状態と思いきや単なるディスプレイOff状態ということになると、知らぬ間にバッテリが消費されるような動作をしてアレなので妥当ではあるが、代替策を用意してほしかった。

代替

とりあえず、C:\Windows\System32\scrnsave.scrを実行するとブランクのスクリーンセーバーが表示されるので、これを利用することにした。
この場合は単に黒い画面を出力しているだけと思われ、画面のバックライトが消灯しないので省電効果は微妙。
あとはInstantGo Disabledで運用するという手もあり、多少のメリットもあるが、代償も大きい。

発見

ここで無理っぽいなとエントリを書こうとしてもう少し探したところ、Connected Standbyに遷移しないわけではないが、裏でデスクトップアプリケーションを動作させたままにする方法がわかった。
Prepare software for connected standby (Windows Drivers)
ここの表から、Desktop Activity Moderator (DAM) phaseという状態があることがわかる。
説明によると、Connected Standbyに向けてデスクトップアプリケーションを停止状態に向かわせるためのステートであり、バッテリー駆動では5分をリミット、電源供給ありの場合は制限なしでこのステートに留まれることがわかる。
また、PowerRequestExecutionRequiredリクエストを投げるとこのステートに入れることがわかる。
リクエストが投げられているかどうかは、powercfg.exe /requests実行:にプログラムが表示されているかどうかで確認できる。

これで捜索したところ、このあたりが見つかった
http://social.msdn.microsoft.com/Forums/ja-JP/6c135adb-7993-4691-b700-bd463ed8816c/windows-8-connected-standby-vs-desktop-audio-player-application?forum=windowssdk
http://stackoverflow.com/questions/23398950/any-api-to-prevent-windows-8-from-going-into-connected-standby-mode
後者のコードを参考にして実行したところ、確かに裏でDropboxの同期、ソフトウェアのインストールなどが継続できることが確認できた。
またpowercfg.exe /requestsの実行結果によると、Chrome(デスクトップ版)でダウンロードを実行中、同じリクエストを投げてダウンロードを継続しようとしていることが確認できた。

さらなる検証

しかし、サウンド再生はこの状態ではできないようだった。
動画などを再生しリクエストを投げた状態で画面をオフにすると、スピーカーから音声の再生は止まるが、再び画面をオンにすると再生時間がその分も進んでいることがわかるので、
サウンドインターフェースをWindowsが休止させているのではないかと思い、
ではストアアプリで音楽再生をしたままデスクトップで再生して画面オフにしてはどうかと試してみたところ、デスクトップアプリ側の音だけが聞こえなくなり、ストアアプリ側は継続して聞こえるという結果になった。

ネットワークに関しては、リクエストを投げない状態の場合、pingには問題なく応答するが、適当にiperfのサーバ側を動かして試したところ、何故か繋がったり繋がらなかったりするよくわからない状態になり、
リクエストを投げた状態の場合は、問題なく動作するという結果になった(つまり問題ない)。

結論

サウンド再生がしたいわけではなく、インストールや大規模な同期をする時にはだいたい電源があるので、個人的な要求はこれでまあまあ満たされた。
しかし画面オフのままUSB-OTG接続したUSBメモリに大容量ファイルコピーをしたい場合など、VivoTab Note 8の場合は電源供給と両立できないので困るなと思った(今のところそのシチュエーションはない)。

わりと便利なので使うといいと思いました。タスクトレイに常駐するUIでも書こうか。

*1:Windows Store Appは制限はあるものの、Connected Standby状態でも動けるので、音楽再生、ブラウザでのファイルダウンロードなど要求がこちらで満たせる場合であれば、こちらを使うほうがよい。