Visual C++と同じに作ればいいじゃないかと思ったが、Borland C++ 5.5フリーには「SCRNSAVE.LIB」が存在しません。

では、SCRNSAVE.LIBを使わずにスクリーンセーバーを作るには?

スクリーンセーバーは、基本的に拡張子がSCRになっていますが、EXEファイルと変わりません。例に、EXEファイル単独で動くような簡単なアプリケーションの拡張子をscrにしてスクリーンセーバーとして登録するとウィンドウ付で勝手に表示されます。例えばフリーセルなど。ちなみにWindows 2000等は、拡張子をscrにしても自動的にexeファイルをコピーしてきます。

ただし、プレビューのときもスクリーンセーバーの起動のときも動作が同じですね。これらの動作は、Windowsがスクリーンセーバーを起動するときにオプションを指定しています。そのオプションはWinMainの3個目の引数に渡されます。したがって、引数をチェックすれば、動作を切り替えられます。

3個のオプションがあって、

/p HWNDを10進数文字列に変換した値  スクリーンセーバのプレビュー(スクリーンセーバーを選択しているときに表示されるスクリーンセーバーの縮小版)

/c   スクリーンセーバーの設定時

/s   指定時間が経過したのでwindowsがスクリーンセーバーの起動するときの引数

/a   パスワード

のとおりです。

通常のウィンドウを表示するプログラムでウィンドウ作成時の属性を、最大化・最小化・?ボタンを持たず、境界線の無い、画面サイズと同じ大きさとします。(画面いっぱいのウィンドウを作成する。)

この状態でEXEファイルを作り拡張子をSCRに変更してスクリーンセーバーとすると、スクリーンセーバーが起動されたときは、普通のスクリーンセーバーですが、Alt+F4キー以外で終了できません。(自分で使うスクリーンセーバーなら気にならないと思いますが、他人が使う場合ショートカットキーを知らない人の場合終了できないかも)また、スクリーンセーバを選択しているときも選択画面のプレビューが画面いっぱいになってしまうことや、設定時もスクリーンセーバーがいっぱいに表示されます。

H16.5.4

まず、プレビュー画面をサポートします。

まず、スクリーンセーバの起動時の引数で/pであることを確認して、その後の文字列ををatol関数でlong型に変換しHWND型にキャストします。HWNDを利用してGetWindowRect関数で、プレビューウィンドウの大きさを得ます。

その大きさを元にHWNDの子ウィンドウを作成します。さて、引数を/pや数字文字列に分解しなければなりませんが、幸いVisual C++のスタートアップルーチンの中で引数を解析して、__argv,**__argvに保存してくれます。コマンドラインのプログラムのmainの引数と同様です。さて、スクリーンセーバの実行時の大きさを呼び出すときに決めだせるということなので、うまいこと作れば4個のスクリーンセーバーを同時に表示したりすることも可能かもしれません。ひまなときにやって見たいと思います。

H16.5.4

ところで、お預けになっていた、スクリーンセーバーの終了ですが、WndProcでキーボード(WM_KEYDOWN)とマウスクリックのイベント (WM_LBUTTONDOWN,WM_RBUTTONDOWN)が発生した場合か、とマウスカーソルの移動(WM_MOUSEMOVE)のイベントが発生し、スクリーンセーバーが起動していたときと位置が移動していた場合に終了するようにしました。

残りは、マウスカーソルの消去とIMEの消去の処理を今度考えて見ましょう。

とりあえず、フルスクリーンとプレビューと終了をサポートした、アナログ時計スクリーンセーバのソースと実行ファイルを公開します。Visual C++ 5.0とBorland C++ 5.5.1でコンパイルできました。

H16.5.9

パスワードですが、Windows 2000では、スクリーンセーバーで何もしなくても、終了時に勝手にログオンと同じダイアログボックスでパスワードを聞いてきます。Windows 9xでは、レジストリHKEY_CURRENT_USER\Control Panel\\desktop\ScreenSaveUsePasswordをみて、パスワードが設定されているのを確認して、パスワードを入力させて判断する必要があります。ちなみにWindows 2000ではこれレジストリーキーは定義されていないので、Windows 9x用にスクリーンセーバを作成しておけば、スクリーンセーバーはパスワードがないと判断します。あとはWindows 2000が勝手に処理してくれるわけです。ですので、バージョンチェックは必要ないと判断しました。

 

パスワードをチェックしてパスワードがあればメッセージボックスを表示します。結局パスワードロックはまだ記述しておりません。

ソース     scrsamp.cpp H16.5.9

実行ファイル scrsamp.scr H16.5.9