6

Mutex のソリューションを使用して、アプリケーションの複数のインスタンスを同時に開くことを禁止しました

しかし、Windowsでユーザーの切り替えを使用して別のユーザーを開いてアプリケーションを開こうとすると、正常に開き、他のアカウントで実行されていることを検出できません

このような問題を解決し、ログインしている Windows ユーザー アカウント間でアプリケーションを開くことを禁止するにはどうすればよいでしょうか

私はこのようなコードを使用しています

Dim onlyInstance As Boolean = False
_mutex = New Mutex(True, "Application Name", onlyInstance)
If Not onlyInstance Then
   MessageBox.Show("Application is already running.", "Error.")
   System.Diagnostics.Process.GetCurrentProcess.Kill()
   System.Diagnostics.Process.GetCurrentProcess.WaitForExit()
End If
4

4 に答える 4

4

ミューテックスをグローバルにすると、すべてのユーザーに表示されます。

mutexName = String.Format("Global\\{{{0}}}", "Application Name"); 

ドキュメントから:

名前付きシステムミューテックスは、2つのレベルの可視性を持つことができます。名前がプレフィックス「Global\」で始まる場合、ミューテックスはすべてのターミナルサーバーセッションで表示されます。名前がプレフィックス「Local\」で始まる場合、ミューテックスは、それが作成されたターミナルサーバーセッションでのみ表示されます。その場合、サーバー上の他のターミナルサーバーセッションのそれぞれに、同じ名前の個別のミューテックスが存在する可能性があります。名前付きミューテックスを作成するときにプレフィックスを指定しない場合は、プレフィックス「Local」が使用されます。ターミナルサーバーセッション内では、名前がプレフィックスのみが異なる2つのミューテックスは別々のミューテックスであり、両方ともターミナルサーバーセッションのすべてのプロセスに表示されます。つまり、プレフィックス名は「Global」と「Local」です。

于 2012-10-15T15:18:57.577 に答える
1

私が 30 年間使用してきた手法は、アプリケーションが起動時に排他アクセスのために既知のファイルを開こうとし (そして開いたままにし)、そのファイルを開けない場合は終了するというものです。

私はそれが真剣にローテクでレトロであることを知っていますが、シンプルで、常にサポートされており、文字通りどこでも動作します. 私はそれを、半ダース以上の OS の製品コードと、ダース以上の異なるプログラミング言語でうまく使用してきました。

于 2012-10-15T15:34:07.953 に答える
0

管理者以外の他のユーザーが他のユーザーのプロセスを見ることはできないと思います。

私が提案するのは、システム空間で実行される Windows サービスを作成することです。その後、プログラムはそれに接続し、起動するかどうかを決定できます。

于 2012-10-15T15:17:52.400 に答える
0

WPF アプリケーションのこのソリューションを見てください。Mutex を使用して一意性を確立しますが、WCF を使用して新しいインスタンスがプライマリ インスタンスと通信できるようにします。

于 2012-10-15T15:54:19.267 に答える