6

我使用 Mutex 的解决方案来禁止同时打开多个应用程序实例

但是,当我在 Windows 中使用 Switch User 并打开另一个用户并尝试打开应用程序时,它正常打开并且无法检测到它正在其他帐户上运行

我怎么能解决这样的问题并不允许在登录的 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"); 

文档中:

命名系统互斥体可以有两个可见性级别。如果其名称以前缀“Global\”开头,则互斥锁在所有终端服务器会话中可见。如果其名称以前缀“Local\”开头,则互斥锁仅在创建它的终端服务器会话中可见。在这种情况下,具有相同名称的单独互斥锁可以存在于服务器上的每个其他终端服务器会话中。如果您在创建命名互斥锁时未指定前缀,则它采用前缀“Local\”。在终端服务器会话中,名称仅在前缀上有所不同的两个互斥体是单独的互斥体,并且它们对终端服务器会话中的所有进程都是可见的。即前缀名称“Global\”和“Local\”

于 2012-10-15T15:18:57.577 回答
1

我使用了 30 年的技术是让应用程序在启动时尝试打开(并保持打开)一个已知文件以进行独占访问,然后在无法打开该文件时退出。

我知道这是严重的低技术和复古,但它很简单,始终支持并且几乎可以在任何地方工作。我已经在超过六种操作系统和十几种不同的编程语言中成功地在生产代码中使用了它。

于 2012-10-15T15:34:07.953 回答
0

我不认为其他非管理员用户可以看到其他用户的进程。

我的建议是编写一个在系统空间中运行的 Windows 服务。然后您的程序可以连接到它并确定是否启动。

于 2012-10-15T15:17:52.400 回答
0

看看这个针对 WPF 应用程序的解决方案,它使用 Mutex 来建立唯一性,但也使用 WCF 允许新实例与主实例通信。

于 2012-10-15T15:54:19.267 回答