【问题标题】:One instance application over multiple Windows user accounts多个 Windows 用户帐户上的一个实例应用程序
【发布时间】:2012-10-15 15:12:53
【问题描述】:

我使用 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

【问题讨论】:

    标签: c# .net vb.net mutex user-accounts


    【解决方案1】:

    如果您将互斥锁设为全局,那么它将对所有用户可见:

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

    来自documentation

    命名系统互斥体可以有两个可见性级别。如果它的名字 以前缀“Global\”开头,互斥锁在所有终端中可见 服务器会话。如果其名称以前缀“Local\”开头,则 mutex 仅在它所在的终端服务器会话中可见 创建的。在这种情况下,可以存在具有相同名称的单独互斥锁 在服务器上的每个其他终端服务器会话中。如果你这样做 创建命名互斥体时不指定前缀,它需要 前缀“本地\”。在终端服务器会话中,两个互斥锁 名称的区别仅在于它们的前缀是单独的互斥体,并且两者都是 对终端服务器会话中的所有进程可见。那就是 前缀名称“Global\”和“Local\”描述互斥锁的范围 相对于终端服务器会话的名称,而不是相对于进程的名称。

    【讨论】:

    • 这实际上与发帖人要求的相反
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        看看this solution for WPF applications,它使用互斥锁来建立唯一性,但也使用 WCF 允许新实例与主实例通信。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-12
          相关资源
          最近更新 更多