単純なスクリーンセーバーはプログラムとしては非常に簡単な部類に入ります。
今回はスクリーンセーバーを作成してみます。
1 スクリーンセーバーの仕様
(1)スクリーンセーバーとは
Windowsのスクリーンセーバーは、実は中身は通常の実行ファイル(exeファイル)です。通常のexeファイルの拡張子をscrに変更して、Windows95/98/MEなら C:\WindowsフォルダにWindows
2000/XPなら C:\Windows\System32フォルダにおくだけです。従って、どんなexeファイルでもscrに拡張子をかえて、当該のフォルダにおけばそれでスクリーンセーバーになってしまいます。あとはコントロールパネルの「画面」からスクリ−ンセーバーに指定すれば、所定の時間経過後、システムがスクリーンセーバーを自動的に起動します。
ただし、いちおうスクリーンセーバーには仕様が決められており、いくつかの機能を実装する必要があります(全てを実装する必要はありません)。その仕様について以下に簡単な説明をしておきます。
(2)スクリーンセーバーのコマンドパラメータ
スクリーンセーバーはコマンドラインを伴って起動される仕様になっており、渡されたコマンドラインを解析して、適切な動作をするように作らなければなりません。
(Windows XPの場合)
画面のプロパティで、[スクリーンセーバー]タブを選択すると、/Pオプションでスクリーンセーバーが起動されます。別のスクリーンセーバーを選択した時も/Pオプションで起動されます。/Pオプションで起動した時は、コマンドライン引数で上の小さなサンプル表示用のディスプレイのウインドウハンドルが渡されるので、そこに表示するようにスクリーンセーバーを設計します。
[設定]では、/Cオプションで起動されます。
[プレビュー]では/Sオプションで起動されます。
Windows XPでは/aオプション(パスワード機能)での起動は見当たりません。(Windows95/98であったようですが)
/sオプション
通常、所定の時間経過後にシステムから呼ばれる場合は、/Sオプションつきで起動されます。
また、画面のプロパティの「プレビュー」を押した時も、/Sオプションで起動されます。
/Sオプションで起動されたときには、通常のスクリーンセーバーの機能を実行するようにします。
/C
画面のプロパティで、「設定」ボタンをおすと、/Cオプションで起動されます。
/Cオプションで起動された時は、スクリーンセーバーの設定画面を表示するようにします。例えば、画面に表示する物体の個数や速さ、色などを指定させます。その内容はレジストリやINIファイルなどに格納し、スクリーンセーバーが/Sオプションで起動されたときには、格納した設定内容を読み出し、設定に従った動作を行うようにします。
/a パスワード機能
/aオプションで起動された時は、パスワード入力を行います。
/p
/pオプションで起動された時は、コマンドラインの引数で、/pオプションの次にウインドウハンドルが渡されます。そのウインドウハンドルにスクリーンセーバーを表示するようにしなければなりません。
/pオプション多重起動の危険性に注意
/pオプションの起動では、スクリーンセーバーが多重起動される可能性があります。多重起動しないように設計しておく必要があります。
2 スクリーンセーバーを作ってみる
スクリーンセーバーは総じて簡単なプログラムですが、/pオプションに対応するための機能の実装はやや高度なプログラムの部類に入ります。また/cや/aへの対応もとりあえずなしということで、今回は/sのみに対応したシンプルなスクリーンセーバーを作成してみます。その他のオプション機能の実装はまた別の機会ということで。
シンプルながら、「警告!ウイルスに感染してます」という、ちょっといたずらなスクリーンセーバーを作ってみます。真っ黒な画面に赤で「警告!ウイルスに感染してます」という文字が下へスクロールしていきます。(末っ子がまだ小さかった頃、「またお父さんのパソコンがウイルスに感染してるー」とびっくりして報告に来てくれたものです。)
(1)デザイン画面(コントロール)
準備するコントロールは、フォーム(Form1)、ラベル(Label1)、それにタイマー(Timer1)です。
(Visual Basicのデザイン画面)
Form1のプロパティ
BackColor |
今回は真っ黒な画面にしますので、黒に指定します。 |
BorderStyle |
ウインドウの境界および境界に関連するものを表示しませんので、0(none)に指定します。 |
WindowState |
このプログラムではコードの中でウインドウの状態を最大化(WindowState=2)していますので、特に意識して指定する必要はありませんが、通常は最大化しておきます。2を指定します |
|
|
Label1のプロパティ
Backstyle |
0(透明)にします。Form11の黒が透けて表示されます。 |
BorderStyle |
ラベルの境界線を表示しませんので、0(none)に指定します。 |
Caption |
”警告! ウイルスに感染しています”にします。 |
ForeColor |
赤を指定します |
Timer1のプロパティ
Intervalを200に指定して、0.2秒毎にタイマー割り込みがかかるようにします。→ラベルを動かす。
(2) コード
宣言部
カーソルの表示のOn/OFFをするAPI関数を宣言します。
Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long
|
フォームのロード
Private Sub Form_Load()
Dim r As Long
Select Case UCase(Left$(Command$, 2))
Case "/S"
Form1.Show
Form1.WindowState = 2
r = ShowCursor(False)
Label1.Left = 100
Label1.Top = 10
Case Else
End
End Select
End Sub
|
コマンドラインのパラメータを解析し、/s(または/S)ならForm1を表示し、WindowStateを2(最大化)に設定し、全画面表示します。オプションは小文字(/s)で与えられるか大文字(/S)で与えられるか不明なため、Left$で左側の2文字を取り出し、Ucaseで大文字に変換しておきます。
Command$というのは、コマンドライン引数を取得する関数です。
/Sオプションだった場合は、ShowCuror関数でカーソル表示を消します。
Label1をLedt=100, Top=10の位置にセットします。
それ以外の場合は、何もせず終了します。
タイマー
Private Sub Timer1_Timer()
If Form1.WindowState <> 2 Then Form1.WindowState = 2
Label1.Top = Label1.Top + 100
If Label1.Top > Screen.Height - 200 Then Label1.Top = 10
End Sub |
Label1の位置を少しづつ下に移動し、下までいくと上に戻します。
マウスのクリック、キーの押下でスクリーンセーバーを終了する
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
r = ShowCursor(True)
End
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
r = ShowCursor(True)
End
End Sub
|
マウスのクリックやキーの押下があった場合、カーソル表示を復帰させ、スクリーンセーバーを終了します。通常はマウスの移動でも終了させたりしますが、ここでは省略しました。
いちおう、Visual Basicのソース(Visual Basiv4作成)と実行ファイルを置いておきます。exeファイルの拡張子をscrにしてC:\Windows\System32フォルダに移動して下さい。exeファイルのまま動作を試す場合は、[ファイル名を指定して実行]で/sオプションをつけて起動して下さい。
blackout.zip
|