.NET TIPS

Visual Basic 2005で多重起動禁止時に最初のインスタンスにパラメータを渡すには?[VS 2005のみ、VB]

デジタルアドバンテージ 遠藤 孝信
2007/10/25

 Visual Basic 2005でWindowsアプリケーションの多重起動を禁止するには?では、複数のWindowsアプリケーションの実行を制限する方法について解説しているが、単純に2つ目のインスタンスの起動を禁止するのではなく、すでに起動している最初のインスタンスで新たなコンテンツを開くようにしたい場合がある。

 例えば、たいていの音楽再生アプリケーションでは、.MP3ファイルをエクスプローラでダブルクリックすることにより、現在の再生を中断して、いまダブルクリックされた.MP3ファイルを新たに再生するようになっている。

 このようなアプリケーションを作成するには、2つ目のインスタンス起動時のコマンドライン引数を、最初のインスタンスで受け取ることができればよい*1。Visual Basic 2005のアプリケーション・フレームワーク*2を利用して多重起動を禁止する場合には、StartupNextInstanceイベント・ハンドラとなるメソッドのパラメータで、2つ目のインスタンスに指定されたコマンドライン引数を受け取ることができる。

*1 特定の拡張子と関連付けられたアプリケーションは、その拡張子のファイルをエクスプローラでダブルクリックすることにより、そのファイルがコマンドライン引数で指定された状態で実行される。また、エクスプローラでアプリケーションにファイルをドラッグ&ドロップしても、そのファイルがコマンドライン引数で指定された状態でアプリケーションが実行される。

*2 VB 2005のアプリケーション・フレームワークについては「TIPS:Visual Basic 2005のアプリケーション・フレームワークとは?」を参照。

 以下では記述例として、コマンドライン引数で指定されたテキスト・ファイルを、常に1つのインスタンスで開くサンプル・アプリケーションを作成する。

単一インスタンスでテキスト・ファイルを開くサンプル・アプリケーション

 まず、コマンドライン引数で指定されたファイルを開き、その内容をテキストボックスで表示する処理をLoadイベント・ハンドラで記述する。ここではフォーム(Form1)上にテキストボックス(TextBox1)が配置されているものとする。また、そのテキストボックスではMultilineプロパティをTrueに設定し、複数行表示できるようにしておく。

Public Class Form1

  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    ' コマンドライン引数の取得
    Dim args As String() = Environment.GetCommandLineArgs()

    If args.Length > 1 Then
      Dim fileName As String = args(1) ' コマンドラインの第1引数
      openFile(fileName)
    End If
  End Sub

  ' 指定されたファイルを開き、テキストボックスで表示
  Sub openFile(ByVal fileName As String)
    Me.TextBox1.Clear()
    Me.TextBox1.AppendText(System.IO.File.ReadAllText(fileName))
  End Sub

End Class
リスト1 指定されたファイルをテキストボックスで表示するLoadイベント・ハンドラ

 コマンドライン引数の取得に関しては「TIPS:コマンドライン引数を取得するには?」を、ReadAllTextメソッドによるファイルの読み込みに関しては「TIPS:テキスト・ファイルの内容を簡単に読み込むには?」を参照していただきたい。

 次に、StartupNextInstanceイベント・ハンドラを以下のように記述する。StartupNextInstanceイベント・ハンドラの追加に関しては、「TIPS:Visual Basic 2005で多重起動禁止時にメッセージを出すには?」で解説している。

Private Sub MyApplication_StartupNextInstance(ByVal sender As Object, ByVal e As ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance

  If e.CommandLine.Count > 0 Then

    ' コマンドラインの第1引数を取得
    Dim fileName As String = e.CommandLine(0)

    My.Forms.Form1.openFile(fileName)
  End If

End Sub
リスト2 StartupNextInstanceイベント・ハンドラ
実際に記述するのは白字部分のみ。グレーの部分は自動作成される。

 StartupNextInstanceイベント・ハンドラでは、第2パラメータであるStartupNextInstanceEventArgsオブジェクト(Microsoft.VisualBasic.ApplicationService名前空間)のCommandLineプロパティから、2つ目のインスタンスに指定されたコマンドライン引数を取得できる。CommandLineプロパティの値は、ReadOnlyCollectionクラス(System.Collections.ObjectModel名前空間)のオブジェクトである。

 なお、リスト1のEnvironment.GetCommandLineArgsメソッドが返す文字列配列では、2番目の要素がコマンドラインの第1引数となるのに対して(1番目の要素はアプリケーション自体のフル・パス名)、リスト2のCommandLineプロパティでは先頭の要素がコマンドラインの第1引数となる点に少し注意が必要だ。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Visual Studio 2005 処理対象:プロジェクト
カテゴリ:Visual Basic 2005 処理対象:アプリケーション・フレームワーク
使用ライブラリ:StartupNextInstanceEventArgsクラス(Microsoft.VisualBasic.ApplicationService名前空間)
使用ライブラリ:ReadOnlyCollectionクラス(System.Collections.ObjectModel名前空間)
関連TIPS:Visual Basic 2005でWindowsアプリケーションの多重起動を禁止するには?
関連TIPS:Visual Basic 2005のアプリケーション・フレームワークとは?
関連TIPS:コマンドライン引数を取得するには?
関連TIPS:テキスト・ファイルの内容を簡単に読み込むには?
関連TIPS:Visual Basic 2005で多重起動禁止時にメッセージを出すには?

この記事と関連性の高い別の.NET TIPS
Visual Basic 2005で多重起動禁止時にメッセージを出すには?
Visual Basic 2005でWindowsアプリケーションの多重起動を禁止するには?
WPFでコマンドライン引数を取得するには?
コマンドライン引数を取得するには?
標準入力(パイプ)からテキストを読み込むには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間