具有互斥锁的单实例应用程序 OS

Single Instance Application OS wide with mutex

按照描述完成:

What is the correct way to create a single-instance application?

http://www.c-sharpcorner.com/UploadFile/f9f215/how-to-restrict-the-application-to-just-one-instance/

互斥体在用户会话中工作正常。 但是当我切换用户时,它不起作用。可能是因为一个用户是域用户而我启动程序的另一个用户是本地用户?我还没有对两个本地用户进行测试...

我只需要在计算机上有一个实例。

我希望互斥量 OS 宽。这是一个错误的假设吗?

public partial class App : Application
{
    private static Mutex _InstanceMutex = null;

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        bool isNewMutex;
        _InstanceMutex = new Mutex(true, "{ED75DE2B-69F7-4973-A58C-3A9D49B3E48D}", out isNewMutex);
        if (!isNewMutex)
        {
            _InstanceMutex = null;
            MessageBox.Show("Only one instance allowed", "ThisApp");
            Process.GetCurrentProcess().Kill();
            Application.Current.Shutdown();
            return;
        }
        //base.OnStartup(e);
    }

    private void Application_Exit(object sender, ExitEventArgs e)
    {
        if (_InstanceMutex != null)
            _InstanceMutex.ReleaseMutex();
        //base.OnExit(e);
    }

我认为您在创建 MutexSecurity 时会希望将其传递给 Mutex。文档底部的示例显示了如何将互斥锁锁定到特定用户。另请参阅备注,有全局和本地会话之类的东西,可能适用于您,也可能不适用于您。

Mutex Constructor (Boolean, String, Boolean, MutexSecurity)待用。

编辑

您也可以试试这个方法:

if(!(Mutex.TryOpenExisting("Global\{ED75DE2B-69F7-4973-A58C-3A9D49B3E48D}", out tempMutex)))
{
   _InstanceMutex = new Mutex(true, "Global\{ED75DE2B-69F7-4973-A58C-3A9D49B3E48D}");
   //Continue startup normally
}
else
{
   //Already exists, shutdown app
}

除非您设置了互斥锁安全性,否则这不应引发异常。