月刊ソフト作り!
Make The Software For VisualBasic


『スクリーンセーバーを作る(初級編)』
2002.Jan.22

 Presented by kouta_y
感想等は掲示板、苦情はメールへ。

会社
第2弾です。
とりあえず初めてスクリーンセーバを作る人向けです。


スクリーンセーバーとは?

元々は「画面焼け」を防ぐ為のものでした。
企業に勤めている方だと、一日中パソコン起動しっぱなしで、画面焼けしているディスプレイをよく見かけた事でしょう。
画面焼けとは、長時間同じ画面を映しっぱなしにしておくと、その画面がディスプレイに焼き付いてしまう事を言います。
焼きつくと、画面を切り替えてもうっすらと残ってしまい、非常にうだったいです。
その防止策として、長時間ユーザーの操作がなれば、画面を切り替えて「焼きつかないようにする」ソフト。スクリーンセ−バーが出来ました。

通常は背景色は黒。
見てて飽きないようにする為に、何か絶えず動き回っているキャラクタを表示させるのが一般的です。

んがしかし。
最近のディプレイは性能が良いので、画面焼けなどほとんどなくなりました。
これも時代の流れなのか、スクリーンセーバーの用途は「画面焼け防止」から「デスクトップのステータス」の一つになってきました。

そのせいでソフト作家さんの「センスの良さ」を問われるものになってしまいました・・・。
なにもスクリーンセーバーに限らずですが、機能よりも「見てて面白い」を作れるようにしましょう。


スクリーンセーバーを作る時の基本

さて、筆者のうんちくはまだ続きます。


■ 起動
基本といより常識というか基本です。
スクリーンセーバーは、他のソフトと違い、「ユーザーがダブルクリックしたら起動」という訳ではありません。
起動の命令はWindowsから飛んできます。
もしくは「画面のプロパティ」から「プレビュー」や「設定」「パスワード」などの操作時に起動命令がきます。
後々説明しますが、その時「引数」というものが一緒に一緒に渡されてきます。
それを読み取り、「設定をさせる」のか「本来のスクリーンセーバーを実行する」のか、スタートアップ時に分岐させる必要があります。

■ 終了
これは言うまでもありませんが、スクリーンセーバーの終了は「ユーザーが何か操作をしたら」という事になります。
マウスをちろっと動かしたら、即終了みたいな。
これは特に難しくはありませんね。
KeyDownやMouseMoveイベントなどで終了処理をさせれば良いわけです。


さっそく作る!

さて、いつまでもうんちくたらたらでは「ここのHPはうんこちんちんやな」なんて思われてしまうので、さっそく製作にいきましょう。

まずいつも通り、VBエディタを起動してもらい、その後、新規作成で「標準EXE」を選択します。

これね



さて次にプロジェクト名ですが、ここでは「MyScr」とします。
ここは任意で構いません。

次にフォームのオブジェクト名を「Frm_Main」にします。
ここも任意です。

この辺りで一度保存しておくと良いかもしれません。


フォームのプロパティ

まず最初にメインフォームのプロパティをいじります。
このフォームをスクリーンセーバーとして使用するわけです。
以下の様に設定してください。

Appearance 0 - フラット
BackColor
BorderStyle 0 - なし
Caption 空白(なし)
ControlBox False
ScaleMode 3 - ピクセル
WindowState 2 - 最大化


こんな感じになりましたか?

まだ実行はしないでください。
してしまった人は、「Alt + Tab」でエディタに画面を移し、停止ボタン(■)で終了してください。


イベントハンドラを作る

さて次に「イベントハンドラ」です。
以下のような操作をされた場合、終了するようにします。

イベントの追加は右上の方の、

このボックスから挿入できます。

キーが押された
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
'キーが押された
Unload Me
End Sub

マウスのボタンが押された
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'マウスのボタンが押された
Unload Me
End Sub

とりあえずこの2つです。
使わなくても引数や名前など変更はしないでください。
変更すると正しくイベントをキャッチできなくなります。
あと、「押された」と「クリック」は微妙に違います。


さて、ここまで出来たらとりあえず試しに起動してみましょう。
三角マークもしくは「F5」キーから実行できます。

ぶわっと画面が真っ黒になり、キーを押すか、マウスをクリックして終了すればOKです。


マウスが動いたら終了

はい。気づいたと思いますが、まだこのイベントハンドラは完成ではありません。
「マウスを動かしたら」というイベントを作っていません。
別に忘れた訳ではなく、ちょいと他のイベントとは異なるので後回しにしました。

「んなもんMouseMoveイベント追加すりゃいんだべ?」

ところがどっこいそうでもありません。
確かにMouseMoveイベントを使うのですが、それだけでは駄目です。
MouseMoveイベントは、起動時にフォームの上にマウスポインタが乗っかってただけで発生してしまいます。
このフォームは、実行時に最大化している為、起動と同時に終了してしまいます。

さて、ではどうやるかというと「グローバル変数」を使います。
グローバル変数の使い方はこの辺でやってます。

下のような変数を宣言してください。
'MouseMove用
Private XX As Integer
Private
YY As Integer

んでMouseMoveイベントを追加して、下の用なコードを打ち込んでください。
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
'マウスが5ピクセル分動いたら

If XX = 0 And YY = 0 Then
'   起動時の位置を記憶
    XX = X
    YY = Y
ElseIf Abs(X - XX) >= 5 Or Abs(Y - YY) >= 5 Then
'   正確には「最初の位置より5ピクセル動いたら」になる
    Unload Me
End If

End Sub

これでOKです。
引数のXとYは、マウスポインタの位置が格納されています。
Abs関数は「絶対値」を返す関数です。

んでまた実行してみてください。
マウスをある程度動かして終了すればOKです。

※なぜ5ピクセルにしているかというと、それは・・・、たろの趣味です・・・。


2重起動の禁止

2重起動禁止とは、複数起動・・・つまり2コも3コも同じアプリケーションを起動させないという事です。
さてこれは何故やるか?ですが。

最初に書いたとおり、スクリーンセーバーの起動はWindowsから命令が飛んできます。
しかし、命令は1回すりゃええものを、実はあほみたいに何個も何個飛ばしてくるんです。

たくさん起動させてしまうと、メモリやリソースの無駄遣い。
さらに、マウスをぐりぐり動かしてもなかなかデスクトップが現れない。
最低最悪のソフトと成りえます。

それを防止する為に、起動時に「既に起動しているか?」の判定をします。
起動していたら、終了。
それ以外であれば、そのまま続行。
という形にします。

これには「Appオブジェクト」の「PrevInstanceプロパティ」を使います。
下のコードをLoadイベントに追加してください。

Private Sub Form_Load()
'重複起動の判定
If App.PrevInstance Then
    Unload Me
End If
End Sub

既に起動していたら、Trueが返ります。
起動していなかったら、Falseが返ります。


実行ファイルの拡張子

拡張子とはファイル名の「.(ピリオド)」から右3〜4文字の部分の事を言います。
例えば「abc.txt」なら「txt」が拡張子です。


さて、スクリーンセーバーの拡張子ですが、これは「scr」になります。
別に「exe」でも実行は出来るんですが、基本ですのでscrで実行ファイルは作ってください。

どうやるかというと、実行ファイルを作る時に出てくるダイアログ。

これね


の「ファイル名(N)」を「MyScr.exe」から「MyScr.scr」に変更します。
これで「OK」を押せば、「MyScr.scr」というファイル名で実行ファイルが作られます。


コンパイルしたら、もう一度実行してみましょう。
上手く期待通りの動作をすればパーペキ(死語)です。


終わり


え!?これで終わり?!ふざけんな!

まぁまぁ(←あほ)
とりあえず初級という事なので、土台作りでおわります。
あとはお好みに、フォームに文字や絵を表示させるコードを追加してください。

まだ最初に言った「起動時の引数取得」や「設定」など作らないといけない所はたくさんあります。
それは次回の「中級編」で・・・。


最後に今回作ったサンプルを下からダウンロード出来ます。
タイマーコントロールを使った処理も加えてあります。

vb02.lzh(5.74KB)