ゲーム中は、スクリーンセーバーやディスプレイ休止を回避しよう

ゲームパッドでゲームをしていたら、いきなり画面が真っ暗に。
という経験をされた方は多いかと思います。
慌ててマウスを動かすも、画面が復帰した頃にはボロボロになった自キャラが…。
 
というわけで、今回はゲーム側でその対処を行いましょう。
電装天使ヴァルフォースでも、途中から対処を行いました。
その時もNyaRuRuさんの記事を参考にさせていただきました。ありがたいことです。
id:NyaRuRu:20080925
 
この記事があるなら、私の記事は要らない?とも思いますが、NyaRuRuさんのは流石に少し情報が古いためちょっとだけ補足を。
ほとんどがNyaRuRuさんもおっしゃっていることだと前置きしておきます。

case WM_SYSCOMMAND:
    if ( (wParam & 0xFFF0) == SC_SCREENSAVE )
    {
        return 1;
    }
    return (DefWindowProc(hWnd, message, wParam, lParam));

マイクロソフトによると、本来であればウインドウメッセージを上記のように処理すれば回避できるはずです。
ですが、今はこれだとダメなケースがあります。
「パスワードによる保護」をONにしている場合です。
NyaRuRuさんによると

Windows Vista 以降,ここにチェックが入っていると,SC_SCREENSAVE トラップを行ってもスクリーンセーバは起動します.

とありますが、実際はWindowsXPでも起動してしまいます。
なのでこの方法はスッパリあきらめたほうが良いでしょう。
 
電装天使ヴァルフォースでは、ShortTimerを使って

case WM_TIMER:
{
    if (::GetFocus() == hWnd)
    {
        ::keybd_event(VK_LBUTTON, 0, 0, 0);
        ::keybd_event(VK_LBUTTON, 0, KEYEVENTF_KEYUP, 0);
    }
    break;
}

こうやって、マウスの左クリックイベントを定期的に発生させることで防いでいます。