作業をしているときにどうしたものかこうしたものか、マウスを動かすこともなくキーボードを叩くことなく考えているときにスクリーンセーバーが起動することはよくあります。こんなときにスクリーンセーバーが起動しないようにするにはどうすればよいのでしょうか? スクリーンセーバーをOFFにする! もちろんそれ以外の方法でです。

こんなページを見つけました。

スクリーンセーバーをプログラムから停止する方法は

スクリーンセーバーが起動する前に、Windowsはアクティブなアプリケーションに対してSC_SCREENSAVEを指定したWM_SYSCOMMANDメッセージを送ります。このときにDefWindowProc()関数を呼ばずに何もしなければスクリーンセーバーを起動させないことができるのです。スクリーンセーバーを起動させないときは0以外の値を返さなければなりません。

ではC#ならどうなるでしょうか? 以下のコードで実験してみるとスクリーンセーバーは起動しません。

ただこの方法はリンク先のページにも書いてありますが、「WM_SYSCOMMANDはアクティブなアプリケーションにしか送られてこないので、自分がアクティブなときにしか抑制できません」。

ではアクティブではない場合であってもスクリーンセーバーを抑止するためにはどうすればいいのでしょうか?

プログラミング/C#/スクリーンセーバー起動の回避 – 武内@筑波大 では以下のようなコードが紹介されていました。

1分以内にマウスカーソルが動けばスクリーンセーバーは起動しない。だったら同じような状態を作り出せないかということで書かれたコードです。実際にはマウスカーソルを動きません。ダミーのインプットを送り続けている限りスクリーンセーバーの起動は阻止できるとのこと。

実際に下記プログラムを実行してみたが、スクリーンセーバーは起動しませんでした。