2009-05-21 12 views
1

私は自分自身の1つのインスタンスだけを実行できるプログラムを持っています。私は私がやりたいことはいくつかの開始を呼び出すと、私のMainFormのWinフォーム上のメソッドを停止するには、コマンドライン引数を処理しているMainWindowHandleからフォームを取得するには?

bool createdNew = true; 
using(Mutex mutex = new Mutex(true, "MobilePOSServer", out createdNew)) 
{ 
    if(createdNew) 
    { 

     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainForm()); 
    } 
    else 
    { 
     Process current = Process.GetCurrentProcess(); 
     foreach(Process proc in Process.GetProcessesByName(current.ProcessName)) 
     { 
      if(proc.Id != current.Id) 
      { 
       SetForegroundWindow(proc.MainWindowHandle); 
      } 
     } 
    } 
} 

このコードを使用します。私はちょうど良いスタートを得ることができます。しかし、新しいコマンドラインウィンドウからアプリケーションを実行し、メソッドを呼び出そうとしていません。窓が前面に来るようにすることができます。ハンドルからフォームを取得できる方法はありますか?

これを行うより良い方法はありますか?

答えて

2

は、あなたが探しているものは以下です:

Single Instance Application, Passing Command Line Arguments

+0

ダングシングルインスタンスの作成は簡単でした。私はそれに話をすることはそんなに苦痛であるとは思わなかった。しかし、意味があります。皆さんありがとう。私はちょうどプロセスの終了を呼び出し終わった、私たちはすでにフォーム出口でのクリーンアップに対処するコードを持っていた。 – nportelli

2

フォーム自体への参照を取得することはできません。いいえ - オブジェクトは別のプロセスに存在します。

他のプロセスを制御できるようにするには、ある種の「リモートアクセス」を公開する必要があります(この場合、「リモート」はこの場合は「プロセス外」を意味します)機械")。これは、.NET Remoting、WCF、またはソケット、名前付きパイプなどをベースにした独自の簡単なプロトコルを介して行うことができます。しかし、それはあなたがどれくらいの痛みを感じるのでしょうか?実際にあまりにも多くの作業を開始します。

1

リモートアプリケーション上で実行する方法は、あなたがまたにWindowsメッセージを送信するためのSendMessage /のPostMessageを使用することができますシンプルであれば他のアプリケーションおよびトリガ動作が実行される。

単純なトリガー以外の他のインスタンスとの相互作用が本当に必要な場合は、Jonの回答を参照する必要があります。名前付きパイプを使用してWCFを選択します。彼が言うように、これはより複雑な解決策になるだろうし、その機能がアプリケーションにとってどれほど重要かを考慮する必要があります。

関連する問題