2012年8月2日木曜日

Windows フォーム アプリケーションに引数を渡す

VB.NETよくわからないのですが仕事で使うことになったのでw 練習がてら、自分で使うためのログビューアを作っています。VS2008です。
詳細仕様は割愛しますが、要はテキストファイルを開いて中身を表示させるものです。一応、ファイル選択ダイアログから開くというのはできるようになったのですが、せっかくなのでデスクトップのショートカットアイコンにドロップして開くというのもやってみようかと。
なんかググったらいろいろ出てきたのですが、コマンドラインで実行する(コンソールアプリケーションですね)のに引数を渡すというのは多いけど、Windowsフォームアプリケーションに渡すというのはあんまりない。
断片的な情報をつなぎあわせて一応できたので、自分用メモw
間違いご指摘とかアドバイスとかあればコメントいただけるとうれしいです。
適当なテストなのでエラー処理とかはしていません。

簡単なサンプルとして、アプリケーションのスタートアップフォームにボタンとファイル選択ダイアログ(OpenFileDialog)とテキストボックスがあって、ボタンクリック→ダイアログ表示→ファイル選択→テキストボックスにファイルパス表示、というのを作ってみました。ここまではまぁわかると思うので説明は割愛w
ダイアログから選択するかわりにファイルをドロップしたいわけです。
ドロップしたファイルのパスの取得については文字通りのやつを見つけたんですが、

実行ファイルにドロップされたファイルのパスを取得する: .NET Tips: C#, VB.NET 

なんかピンと来ないのでここからリンクをたどって、

起動時のコマンドライン引数を取得する: .NET Tips: C#, VB.NET 

を見ると、
「.NET Framework 2.0以降のVB.NETで、My.Application.CommandLineArgs を使用する方法」
というのがあるのでこれが使えそうです。ではこれをどこで使えばいいのか?
さらにググって、フォームアプリで引数を取得する例のようなものを発見。

方法 : Windows フォーム アプリケーションのバッチ モードを有効にする 

これと、参照リンク先の、

方法 : アプリケーション イベントを処理する (Visual Basic) 

を見ると、プロジェクトのプロパティから[アプリケーション イベントの表示]をクリックして出てきた AppricationEvents.vb で、スタートアップフォームが作成される前のアプリ起動イベントが拾えるらしいことがわかりました。
ここでさっきの My.Application.CommandLineArgs を使って引数を取得すればいいようです。

プロジェクトのプロパティページの説明はこのへんが参考になります。

連載! とことん VB: 第 33 回 C# とは異なる、Visual Basic のアプリケーション モデル 言語: VB.NET 


というわけで、できたサンプルのソースはこんな感じ。


(ApplicationEvents.vb)
StartUpイベントで起動時の引数を拾う

Namespace My
    Partial Friend Class MyApplication
        Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup
            If My.Application.CommandLineArgs.Count > 0 Then
                Form1.OpenFileDialog1.FileName = My.Application.CommandLineArgs(0)
            End If
        End Sub
    End Class
End Namespace

(Form1.vb)
ボタンクリックでダイアログからファイル選択して表示
その前にフォームのロード時にファイル名がセットされてたらそれを表示

Public Class Form1
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If DialogResult.OK = OpenFileDialog1.ShowDialog Then
            TextBox1.Text = OpenFileDialog1.FileNames(0)
        End If
    End Sub
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not OpenFileDialog1.FileName = "" Then
            TextBox1.Text = OpenFileDialog1.FileNames(0)
        End If
    End Sub
End Class

デザイナで、OpenFileDialog1のFileNameプロパティは空にしておきます。
これで、ビルドしたexeやそのショートカットにファイルをドロップすると、パスがテキストボックスに表示されます。
ドロップしたらexeが起動するというのはどうやるのかとかも疑問に思ってたんですが、それについては特別何かのコードを追加しなくてもちゃんと起動してくれました。理屈はあとで調べておこうw



0 件のコメント: