programing

Windows에서 하나의 인스턴스 만 실행하도록 C # .net 앱을 강제하는 방법은 무엇입니까?

nasanasas 2020. 11. 30. 17:54
반응형

Windows에서 하나의 인스턴스 만 실행하도록 C # .net 앱을 강제하는 방법은 무엇입니까?


중복 가능성 :
단일 인스턴스 애플리케이션을 만드는 올바른 방법은 무엇입니까?

Windows에서 하나의 인스턴스 만 실행하도록 C # .net 앱을 강제하는 방법은 무엇입니까?


다음과 유사한 뮤텍스 솔루션을 선호합니다. 이렇게 이미로드 된 경우 앱에 다시 초점을 맞 춥니 다.

using System.Threading;

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);

/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
   bool createdNew = true;
   using (Mutex mutex = new Mutex(true, "MyApplicationName", out createdNew))
   {
      if (createdNew)
      {
         Application.EnableVisualStyles();
         Application.SetCompatibleTextRenderingDefault(false);
         Application.Run(new MainForm());
      }
      else
      {
         Process current = Process.GetCurrentProcess();
         foreach (Process process in Process.GetProcessesByName(current.ProcessName))
         {
            if (process.Id != current.Id)
            {
               SetForegroundWindow(process.MainWindowHandle);
               break;
            }
         }
      }
   }
}

.net (C #)에서 프로그램의 한 인스턴스 만 강제로 실행하려면 program.cs 파일에서 다음 코드를 사용하십시오.

public static Process PriorProcess()
    // Returns a System.Diagnostics.Process pointing to
    // a pre-existing process with the same name as the
    // current one, if any; or null if the current process
    // is unique.
    {
        Process curr = Process.GetCurrentProcess();
        Process[] procs = Process.GetProcessesByName(curr.ProcessName);
        foreach (Process p in procs)
        {
            if ((p.Id != curr.Id) &&
                (p.MainModule.FileName == curr.MainModule.FileName))
                return p;
        }
        return null;
    }

그리고 다음 :

[STAThread]
    static void Main()
    {
        if (PriorProcess() != null)
        {

            MessageBox.Show("Another instance of the app is already running.");
            return;
        }
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form());
    }

이것은 내 응용 프로그램에서 사용하는 것입니다.

static void Main()
{
  bool mutexCreated = false;
  System.Threading.Mutex mutex = new System.Threading.Mutex( true, @"Local\slimCODE.slimKEYS.exe", out mutexCreated );

  if( !mutexCreated )
  {
    if( MessageBox.Show(
      "slimKEYS is already running. Hotkeys cannot be shared between different instances. Are you sure you wish to run this second instance?",
      "slimKEYS already running",
      MessageBoxButtons.YesNo,
      MessageBoxIcon.Question ) != DialogResult.Yes )
    {
      mutex.Close();
      return;
    }
  }

  // The usual stuff with Application.Run()

  mutex.Close();
}

응용 프로그램을 단일 인스턴스로 만드는 또 다른 방법은 해시 합계를 확인하는 것입니다. 뮤텍스를 엉망으로 만든 후 (원하는대로 작동하지 않음) 다음과 같이 작동합니다.

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SetForegroundWindow(IntPtr hWnd);

    public Main()
    {
        InitializeComponent();

        Process current = Process.GetCurrentProcess();
        string currentmd5 = md5hash(current.MainModule.FileName);
        Process[] processlist = Process.GetProcesses();
        foreach (Process process in processlist)
        {
            if (process.Id != current.Id)
            {
                try
                {
                    if (currentmd5 == md5hash(process.MainModule.FileName))
                    {
                        SetForegroundWindow(process.MainWindowHandle);
                        Environment.Exit(0);
                    }
                }
                catch (/* your exception */) { /* your exception goes here */ }
            }
        }
    }

    private string md5hash(string file)
    {
        string check;
        using (FileStream FileCheck = File.OpenRead(file))
        {
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] md5Hash = md5.ComputeHash(FileCheck);
            check = BitConverter.ToString(md5Hash).Replace("-", "").ToLower();
        }

        return check;
    }

프로세스 ID로 md5 합계 만 확인합니다.

이 애플리케이션의 인스턴스가 발견되면 실행중인 애플리케이션에 초점을 맞추고 자체적으로 종료됩니다.

이름을 바꾸거나 파일로 원하는 작업을 수행 할 수 있습니다. md5 해시가 동일하면 두 번 열리지 않습니다.

may someone has suggestions to it? i know it is answered, but maybe someone is looking for a mutex alternative.

참고URL : https://stackoverflow.com/questions/184084/how-to-force-c-sharp-net-app-to-run-only-one-instance-in-windows

반응형