1

とても簡単だと思ったのは、すぐに私を倒すことです。私はネイティブのC#プログラマーではありませんが、単一のインスタンスを持つWinFormアプリケーションを作成するように依頼されました。私はすでにStackOverflowでMutexの例を見てきましたが、私が理解できないことの1つは、コマンドラインのウィンドウにパラメーターを渡し、値を解析し、新しい値でフォームを再描画する機能です。

誰かがこれの例を持っていますか?私をつまずかせているように見える主なものは糸脱毛です。my.exeを実行してウィンドウを表示したいと思います。フォームが実行されるたびに、新しいフォームは必要ありません。新しいパラメーターを取得してフォームに表示するためだけです。

いずれか/すべての返信をいただければ幸いです。

4

2 に答える 2

1

アプリケーションの別のインスタンスを起動すると、同じコードが実行されますが、プロセスは異なります。したがって、プロセス間でのデータの受け渡しを検討する必要があります。名前付きパイプやリモーティングのようなもの。

于 2012-10-16T21:56:05.587 に答える
0

@lazyberezovskyは正しいです。コマンドラインからアプリケーションを再度呼び出すと、関連のない別のプロセスが生成され、呼び出されている新しいプロセスを終了する前に、プロセス間通信で新しいパラメーターを以前に実行していたアプリインスタンスに転送する必要があります。

IMHO、これら2つのプロセス間で通信する最も簡単な方法(確かに最善ではありません)は、Windowsレジストリを使用することです。これは、すでにスレッドセーフであり、APIが非常に単純だからです。

まず、アプリケーションの実行時に、メインフォームを表示する前に、アプリの別のインスタンスが実行されているかどうかを確認するためのチェックを実行します。

falseの場合、アプリが初めて実行され、コマンドラインを処理してフォームを通常どおりに表示します。プロセス間通信に使用されるレジストリキーもクリアします(以下を参照)。

trueの場合、プロセス間通信に役立つ特定のキーのレジストリにコマンドラインを保存し、メインフォームを表示せずにアプリケーションを終了します。

実行中のアプリケーション(最初のインスタンス)は、新しいコマンドラインが必要なレジストリキーを定期的に検査するポーリングメカニズム(1秒に1回起動するWindowsタイマーの場合もあります)を開始する必要があります。通常は文字列を見つけて空にし、何もしませんが、取得した値が空でない場合は、ユーザーが別のパラメータセットを使用してアプリケーションを再度生成したことを意味します。その後、コマンドラインをデコードしてウィンドウを再描画できます。必要に応じて。この後、レジストリエントリを再度クリアして、ポーリングメカニズムが再開し、次にユーザーがアプリケーションを呼び出したときに検出できるようにしてください。

名前付きパイプ、WCF、.remoting、またはTCPソケットは、使用できるIPCメカニズムであり、ポーリングメカニズムを必要としないため、一部の人は眉をひそめる可能性があります。;)

お役に立てれば!

于 2012-10-16T22:37:40.797 に答える