スクリーンセーバーを作成する

まとめると

  • 通常の Win32 アプリケーションだが、NTOS では専用のウィンドウステーション上で動作する。
  • ファイル名は 8.3 形式で SS+6文字+".SCR" *1
  • 名前を文字列リソース IDS_DESCRIPTION (ID 1) に設定する。
  • アイコンをアイコンリソース ID_APP (ID 100) に設定する。
  • パラメータなしで実行された場合、設定ダイアログを表示する。
  • パラメータ /c で実行された場合も、設定ダイアログを表示する。
  • パラメータ /config で実行された場合も、設定ダイアログを表示する。
  • パラメータ /s を指定された場合、スクリーンセーバーとしての機能を実行する。
  • パラメータ /p を指定された場合、コントロールパネルの画面アプレットなどによるプレビューとしての機能を実行する。続く引数は対象のウィンドウハンドルを16進数文字列に変換したもの。

尚、ファイル名が SS で開始しなかったりロングファイルネームの場合、スクリーンセーバーの選択表示ではスクリーンセーバーの名前としてファイル名を利用する場合があるそうです。*2 また、規定のファイル名形式で IDS_DESCRIPTION が設定されていない場合には、SS を除いた6文字がスクリーンセーバーの名前として採用されます。

また、SCRNSAVE.LIB を利用する場合は、アプリケーションとしてのフレームワークはすべて SCRNSAVE.LIB が行ってくれるため、

  • ファイル名を必ず 8.3 形式にする。*3
  • 名前を文字列リソース IDS_DESCRIPTION (ID 1) に設定する。
  • アイコンをアイコンリソース ID_APP (ID 100) に設定する。
  • スクリーンセーバーの初期化処理を RegisterDialogClasses という名前の関数で作成する。
  • スクリーンセーバー本体は、"WindowsScreenSaverClass" というクラス名のウィンドウで作成する。
  • スクリーンセーバー本体のメッセージ処理を行うためのウィンドウプロシージャは ScreenSaverProc という名前の関数で作成する。
  • 上記関数では DefWindowProc API のかわりに SCRNSAVE.LIB の DefScreenSaverProc 関数を使用する。
  • ダイアログリソース DLG_SCRNSAVECONFIGURE (ID 2003) で「スクリーンセーバーの設定ダイアログ」を作成する。
  • 上記ダイアログのメッセージ処理を行うためのダイアログプロシージャは ScreenSaverConfigureDialog という名前の関数で作成する。
  • 文字列リソース idsIsPassword (ID 1000) 〜 idsDefKeyword (ID 1010) にエラーメッセージやヘルプファイル名などを設定する。(ファイル名同様にすべて長さに制限があるので注意)
  • Win95/98/Me で「パスワードを設定する」ボタンを押されたら SCRNSAVE.LIB の ScreenSaverChangePassword 関数を呼ぶ。

といった実装で完成になります。

*1:こっちが正しい

*2:少なくとも Win95/98/Me/NT4/2000/XP の標準のコントロールアプレットはファイル名を利用してくれます

*3:SCRNSAVE.LIB内の文字列バッファが 13 バイトしかないので...