DOBON.NET DOBON.NETプログラミング掲示板過去ログ

関連付けファイルのダブルクリックで、起動中アプリに読み込む

環境/言語:[Vusual Studio 2008 /Windows Vista Ultimate/Visual Basic/NET Framework 2.0]
分類:[.NET]

お世話になります。

作成したアプリケーションに関連付けしたファイルをダブルクリックすると、作成アプリが起動しファイルを読み込む(こちらのサイトの実行ファイルにドロップされたファイルのパスを取得するを参照)ようにしたのですが、現在このアプリは二重起動を禁止しています。

このアプリが起動中に、別の関連付けファイルをダブルクリックした時に、既起動中のアプリで新たなファイルを開きたいのですが、どのようにするのでしょうか?

二重起動禁止を解除するともちろん複数のアプリが起動してしまうのですが、そうではなく、既に起動中のアプリに読み込むことができません。

ご教授願えますでしょうか?

よろしくお願いいたします。
便利な方法については知りません。

その前提で何が必要そうか考えたものを並べます。

・二重起動かどうかを判定する処理を自分で書く。
・二重起動であった場合、既存のプロセスに通信する。
(メッセージ、リモーティング、etc.)
・後から起動した方に渡されたファイル名を先に起動しているプロセスに通信で渡す。
・後から起動した方を終了する。

さて、これが簡単な方法で提供されているのだろうか?
アプリケーションフレームワークだっけ、なんかそういうプロジェクトの設定があったかと。
ていうかまさにこのサイトに記事あるじゃん。
http://dobon.net/vb/dotnet/process/checkprevinstance.html

実体は Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase の派生クラスで、C# でも簡単実装。
> 実体は Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase の派生クラスで、C# でも簡単実装。
なるほど、あったのですね。orz
Hongliangさん、Azuleanさん

ご教授ありがとうございます。
私もこのページは閲覧したのですが、
このApplicationEvents.vbで取得したコマンドライン引数を
どのようにして開くことができるかわかりませんでした。

書いてあるとおり実装してみたのですが、開けませんでした。
自分用に変えるにもどのようにすればよいのかわかりませんでした。


現状は
Form1〜Form6まで存在します。
スタートアップフォームはForm1です。
ファイルを開くのはForm2です。

exeをクリックすると、Form1が起動します。
(任意で他のFormを開く)
しかし関連付けファイルをダブルクリックすると
Form1とForm2が開き、ファイル内容が、Form2に表示されます。
(ここまでの処理は問題なくできています。)

この状態で、デスクトップ等の別な関連付けファイルをダブルクリックした時に
起動中のexeでコマンドライン引数を取得し、その後をどう処理するのかがわかりません。

希望としては、
起動中のexeのForm2で開いているファイルを破棄して(変更があれば保存後)、そのForm2に新たなファイルを表示するようにしたいと思っています。

いずれは、Form2を複数開けるようにしようと思っていますが、現状ではForm2はひとつのみ表示とします。

アドバイス頂けると幸いです。

よろしくお願いいたします。
一例としては、例えばこのような感じになります。
# もし細かいミスがありましたらすみません。

Public Class Form1
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim fname As String = "引数なし"
        If Environment.GetCommandLineArgs.Length > 1 Then
            fname = Environment.GetCommandLineArgs(1)
        End If
        Form2Manager.DefaultInstance = Form2Manager.Create(fname)
        Me.Text = Application.ProductName
    End Sub
End Class

Friend Class Form2Manager
    Friend Shared DefaultInstance As Form2
    Friend Shared Function Create(ByVal fname As String) As Form2
        Dim frm As New Form2
        frm.LoadText(fname)
        frm.Tag = fname
        Forms.Add(frm)
        frm.Show()
        Return frm
    End Function
    Friend Shared ReadOnly Forms As New List(Of Form2)
End Class

Public Class Form2
    Inherits Form
'(中略)
    Public Sub LoadText(ByVal fname As String)
        TextBox1.Text = fname
    End Sub
End Class

' (ApplicationEvents.vbの中身)
Private Sub MyApplication_StartupNextInstance(ByVal sender As Object, _
 ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
    If e.CommandLine.Count > 0 Then
        Dim fname As String = e.CommandLine(0)
        Form2Manager.DefaultInstance.LoadText(fname)
        '↓複数のForm2を表示する場合はこちら
        'Form2Manager.Create(fname)
    End If
End Sub
H.K.R.さん

ご親切、ご丁寧にご教授ありがとうございます。

また、現時点ではいろいろと問題がありすぐに検証できそうにありませんので
じっくり時間をかけて検証したいと思います。
私自身の理解不足もありまして、いろいろと解読しないとなりません。

また、ApplicationEvents.vbを使用してテストインストールすると
カスタム動作に記述したものがアンインストール時に実行されなくなってしまいます。
インストール時には実行されているようですが。。。
いろいろと問題が出てきています。

慎重に検証していきたいと思います。

どうもありがとうございました。

DOBON.NET | プログラミング道 | プログラミング掲示板