2

私はデスクトップアプリ(C#4.0 Winforms)を開発していますが、その要件の1つは、プログラムを複数回開くことができることです。ただし、ユーザーが特定のドキュメントを複数回開くことができないようにする必要があります(悪いことが起こる可能性があります)。

基本的に、MS Word(少なくとも新しいバージョン)と同じように機能させたいと思います。すでに開いているドキュメントを開こうとすると、そのドキュメントがすでに開いているプログラムのインスタンスに移動します。

私はほとんどの時間をWeb開発に費やしているので、私が知らない簡単な解決策があるかもしれません。

ですから、私には2つの異なるニーズがあります。

1)ファイルが複数回開かれないようにします。2)ファイルを再度開こうとした場合は、インスタンスを前面に移動します。

#1を処理する方法はいくつか考えられますが、他の人がこの問題をどのように解決したのか興味があります。

開いたままで子プログラムを作成するマスターフォーム/プロセスを作成せずに、#2を機能させるためにどこから始めればよいのか、実際にはまったくわかりません。IEは、現在のプログラムのメインフォームの開閉を実際に制御する別のフォームを作成するため、実際の複数ウィンドウのエクスペリエンスというよりも「タブ付き」のエクスペリエンスになります。古いスタイルのMDIに似ています(これでも問題#1が残ります)。

ここでのヘルプ(読むサイト、見る名前空間など)をいただければ幸いです。

編集-これは重複としてマークされており、「重複」がページの上部にあることがわかります。私の要件の1つは、プログラムを複数回開くことができる必要があることです。皆さんも投稿を読みましたか?他の誰かが入って投票して質問を再開できますか?

さらに編集-プログラムが同じドキュメントを何度も開かないようにするために、Mutexのアイデアを採用しました。プログラムのどのインスタンスでドキュメントが開いているかを簡単に見つけて前面に表示する方法が見つからなかったので、今はあきらめて、すでに開いていることを示すメッセージボックスを表示します。名前付きパイプは、私がやりたいことではなく、多くのオーバーヘッドを伴うため(WCFは世界で最も簡単なことではありません)、これには少しやり過ぎのように見えました。

4

2 に答える 2

1

ミューテックスについて質問しています。Windowsでは、MUTEX(相互排他フラグ)を作成できるため、プロセスの2番目のインスタンスが開いても、ミューテックスの作成を試みて失敗します。ミューテックスは、この目的のためのOS全体のグローバル変数(一種)であり、IPC/調整に使用されます。

別の方法はこれです-ドキュメント名が埋め込まれたクラス名(C#やC++ではなくWindowsAPIのようなクラス)でウィンドウを作成し、FindWindow()関数を使用してそのようなウィンドウがすでに開いているかどうかを最初に確認します。次に、SendMessage(HWND)を使用して、そのウィンドウにメッセージを送信して前面に表示できます。したがって、ユーザーがエクスプローラー「myfile.doc」をクリックして既に開いている場合は、ウィンドウを前面に表示するだけです。確認するAPI(私の脳のRAMから、このようなものをどのように覚えていますか?):

 CreateMutex() / OpenMutex()
 FindWindow() / CreateWindow()
 SendMessage() / PostMessage()
 ShowWindow()/ SetWindowPosition()/BringWinToTop()
于 2012-12-30T01:17:58.827 に答える
1

これにアプローチする方法はたくさんあると思いますが、次のようにアプローチします。

アプリケーションのインスタンスを1つだけ持ち、要求された各ドキュメントをアプリケーション内の新しいウィンドウで開きます。

後続のドキュメントを開くと新しいインスタンスが作成されるため、これには少し調整が必要ですが、アプリケーションの最初のインスタンスが作成し、後続のインスタンスがチェックするプロセス間通信メカニズム(名前付きパイプなど)を設定できます。

IPCが存在することがわかった場合、要求されたファイル名を最初のアプリインスタンス(指定されたファイルを開く)に渡してから終了します。

Microsoftの名前付きパイプの使用法に関する優れた記事は次のとおりです。方法:ネットワークプロセス間通信に名前付きパイプを使用する

于 2012-12-30T01:23:10.200 に答える