0

他の場所からアクティブ化できる SysTray アプリケーションをセットアップしようとしています。より具体的には、アクティベーションは変更できないサードパーティのアプリから取得されますが、そのパス (およびパラメーター/引数) を介して独自のアプリをアクティベートできます。

アクティブ化されたら、BalloonText を配置します。フォームは関係ありません。

したがって、解決すべき 2 つの問題があります。

  1. SysTray アプリケーションを単一のインスタンスにします (複数のインスタンスを生成するのはよくないため)。

  2. この他のアプリが引数を使用してアプリケーションをアクティブ化できるようにする

学習者が単純な SysTray アプリケーションを作成するのに役立つ多くのヘルプが用意されています (実際、接続されていないプロジェクトのソリューションの一部として、私たち自身で作成しました)。ただし、これまで単一インスタンスにしようとしたことはありません。

学習者が単一インスタンスの Winforms アプリケーションを作成するのに役立つ多くのヘルプがあります (これも他のプロジェクトの一部としてこれを行いました) が、常に従来のフォーム (SysTray ではない) を使用した単純なアプリケーションです。VisualBasic WindowsFormsApplicationBase メソッドを使用します。

これら 2 つのアプローチを 1 つのソリューションに組み合わせることができないようです。

更新:
以下のハンスの回答はそれを釘付けにします(特に彼のコメント):

これは既に NotifyIcon で処理されているため、フォームにドロップします。そして、「単一インスタンスアプリケーションを作成する」チェックボックス。そして StartupNextInstance イベント。これについて何か特別なことがあると仮定するのをやめる必要があります

4

2 に答える 2

2

他のインスタンスのチェックに関する最初の質問に関しては、これはうまくいくようです。CodeProjectの例をベースラインとして使用しました。Sub Main ルーチンでは、クラスのGetProcessesByNameMethod を使用して他のインスタンスをチェックできます。Processこのようなもの:

Public Sub Main()
    'Turn visual styles back on
    Application.EnableVisualStyles()

    'Run the application using AppContext
    Dim p() As Process
    p = Process.GetProcessesByName("TrayApp") 'Your application name here
    If UBound(p) >= 0 Then
        End
    End If
    Application.Run(New AppContext)

End Sub

SysTray アプリケーションが既に実行されている場合の 2 番目の質問については、.Net プロセス間通信に関するこの記事を試してみてください。それ以外の場合は、作成時に CommandLine 引数を解析しますSub Main

上記記事より:

XDMessaging ライブラリは、同じボックスのクロス AppDomain 通信に対する使いやすいゼロ構成ソリューションを提供します。アプリケーションの境界を越えて対象の文字列メッセージを送受信するためのシンプルな API を提供します。このライブラリでは、ユーザー定義の疑似「チャネル」を使用して、メッセージを送受信できます。任意のアプリケーションは、任意のチャネルにメッセージを送信できますが、受信するにはチャネルにリスナーとして登録する必要があります。このようにして、開発者は、アプリケーションが相互に通信し、調和して動作するための最善の方法をプログラムによって迅速に考案できます。

于 2012-07-15T21:43:58.870 に答える
1

実際にフォームを使用すると、すべてが簡単になります。デザイナーと一緒にアプリを組み立てるのは簡単です。アプリを終了させるのも簡単です。トレイにゴーストアイコンを避けるのも簡単です。コンテキストメニューを作成するのも簡単です。必要に応じてポップアップを追加するのも簡単です。

唯一の単純でないことは、フォームを表示しないようにすることです。このコードをフォームのクラスに貼り付けます。

Protected Overrides Sub SetVisibleCore(ByVal value As Boolean)
    If Not Me.IsHandleCreated Then
        Me.CreateHandle()
        value = False
    End If
    MyBase.SetVisibleCore(value)
End Sub

コンテキストメニューの[終了]コマンドは次のようになります。

Private Sub ExitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem.Click
    Me.Close()
End Sub
于 2012-07-15T22:01:48.907 に答える