VB6.0でスクリーンセーバーを作る方法 - 二重起動の防止
◆概要
このページは、Visual Basic 6.0で、VB6.0でスクリーンセーバーを作る方法のうち、二重起動の防止について記載しています。
VB6.0でスクリーンセーバーを作る方法[基礎編]では、基本的なスクリーンセーバーを作成しました。このセーバーを実行してタスクマネージャーをみるとわかりますが、画面のプロパティで設定した時間が経過するたびにスクリーンセーバーが複数起動してしまいます。
アプリケーションが複数起動するのを防止するには、アプリケーションのインスタンスが複数起動されるのを防止する方法で述べているとおり、通常はApp オブジェクトの、PrevInstance プロパティをチェックします。
ところが、スクリーンセーバーの場合は、これは使えません。コントロールパネルの画面のプロパティでのプレビュー(スクリーンセーバの内容を確認するためのコンピュータのディスプレイの絵の部分)が表示されている状態では、既にプレビュー画面でスクリーンセーバが起動しているので、新たに起動しないという不都合が発生します。プレビューを使う時はアプリケーションの二重起動の防止ではなくウィンドウの二重起動の防止が必要です。
そこで、プレビューモードと通常モードのときにフォームのキャプションを別々に設定して、それをチェックすることで複数起動を防止します。
◆標準モジュール
標準モジュールの宣言部に次のコードを貼り付けます。
'二重起動防止のためのAPI宣言 '指定されたタイトルのウィンドウを探す Private Declare Function FindWindow Lib "user32" Alias _ "FindWindowA" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String _ ) As Long 'スクリーンセーバタイトル(プレビューと通常の区別) Public Const strSaverTitle = "Saver mode" Public Const strPreviewTitle = "Preview mode"
次に、標準モジュールのSub Mainのコードを書き換えます。
Private Sub Main() 'Mainプロシージャからスクリーンセーバーをスタートさせます。 'そうすることで、コマンドラインパラメータに基づき、適切なフォーム 'をロードします。 '通常モードで起動されたとき、二重起動を防止 If FindWindow(vbNullString, strSaverTitle) <> 0 Then End '起動時のコマンドパラメータ判断 '最初"/"を除いた部分を取り出し大文字に変換(大文字でも小文字でも対処するため) strStartType = UCase(Mid(Command, 2, 1)) If strStartType = "" Then 'ユーザーが.scrファイルを右クリックして、[構成]を選んだときは '設定モード strStartType = "C" End If 'パラメータの種類により処理分岐 Select Case strStartType Case "A" 'パスワード設定モードの処理 'ここではノンサポート Exit Sub Case "C" '設定モードの処理 'ここではノンサポート Exit Sub Case "P" 'プレビューモードの処理 'ここではノンサポート Exit Sub 'プレビューモードに対応した場合、Exit Subの代わりに以下を記述 'frmSaver.Caption = strPreviewTitle Case "S" '通常モードの処理(スクリーンセーバー起動) frmSaver.Caption = strSaverTitle frmSaver.Show Case Else 'パラメーター異常のとき Exit Sub End Select End Sub