以前にWindows Vista以上でプログラムからスクリーンセーバーを起動させない方法という記事を書いたのですが、実はもっと汎用的なやり方があったので紹介しておきます。
なお、この処理ですが次のWindowModePatchにオプション設定として実装する予定です。
SystemParamtersInfoなんて便利な処理があったのね・・・
ちょっと気になったのでMSDNで「スクリーンセーバー」をキーワードに検索をかけて見つかった記事を調べていく、という方法で使えそうな処理を探してみたわけです。
で、見つかったのがこの関数。元々は設定ツールを作成したときに呼び出すために用意された関数なのですが、一時的なものにも使おうと思えば使えるのでこれを使った方が早いことが判明しました。いくつか自分が持っているゲームを見てみたのですが、SystemParametersInfoを呼び出しているものがあったので「なるほど!」と思ってしまいました。こんなに簡単なら無理にMOUSEMOVEを発行するように仕向けなくてもよかったわけですね。
使い方を見てみる
とっても簡単です。はい。
//保存する状態 BOOL g_bIsLowPowerActive = FALSE; BOOL g_bIsPowerOffActive = FALSE; BOOL g_bIsScreenSaverActive = FALSE; //モニタを強制的にアクティブにする BOOL SetForceActiveMonitor(void) { //モニタの管理状態を取得 SystemParametersInfo(SPI_GETLOWPOWERACTIVE,0,(UINT *)g_bIsLowPowerActive,0); SystemParametersInfo(SPI_GETPOWEROFFACTIVE,0,(UINT *)g_bIsPowerOffActive,0); SystemParametersInfo(SPI_GETSCREENSAVEACTIVE,0,(UINT *)g_bIsScreenSaverActive,0); //モニタの管理状態を設定 SystemParametersInfo(SPI_SETLOWPOWERACTIVE,FALSE,NULL,SPIF_SENDCHANGE); SystemParametersInfo(SPI_SETPOWEROFFACTIVE,FALSE,NULL,SPIF_SENDCHANGE); SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,FALSE,NULL,SPIF_SENDCHANGE); return TRUE; } //モニタアクティブ状態を無効にする BOOL ResetForceActiveMonitor(void) { //管理状態を復帰させる SystemParametersInfo(SPI_SETLOWPOWERACTIVE,g_bIsLowPowerActive,NULL,SPIF_SENDCHANGE); SystemParametersInfo(SPI_SETPOWEROFFACTIVE,g_bIsPowerOffActive,NULL,SPIF_SENDCHANGE); SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,g_bIsScreenSaverActive,NULL,SPIF_SENDCHANGE); return TRUE; }
ほら、簡単だったでしょ?
必要なのは
- スクリーンセーバーが有効になっているかどうか(SPI_GETSCREENSAVEACTIVE,SPI_SETSCREENSAVEACTIVE)
- モニタが省電力モードになるかどうか(SPI_GETLOWPOWERACTIVE,SPI_SETLOWPOWERACTIVE)
- モニタの電源を切る設定になっているかどうか(SPI_GETPOWEROFFACTIVE,SPI_SETPOWEROFFACTIVE)
の3つです。強制設定するときは現在の状態を変数に保存してからすべてOFFにする、復帰させるときは変数の状態をそのまま設定する、と言う動作です。
なお、最後のフラグがSPIF_SENDCHANGEであれば設定は一時的なものとなり、最悪は再起動で元に戻ります。SPIF_UPDATEINIFILEをつけるとシステムの設定を変えてしまうので要注意です。
これをWindowModePatchとADVゲームに実装するわけ
またバージョンアップの予感です。今回のはちょっと補助的な機能のつもりです。コントローラだけで操作するゲームなのにスクリーンセーバーを無効化しないために勝手に入る、という現象をこちら側から制御しようかな~と思って調べたものがこんな形になってフィードバックするわけですね。おもしろいです。まあしばらく確認が入りますのでそれまでお待ちください、と。