using System.Threading; using System.Windows; namespace AudioBotProject { public partial class App : Application { // 💡 프로그램 전체에서 딱 하나만 존재해야 하는 '뮤텍스(열쇠)'입니다. private static Mutex? _mutex = null; // 프로그램이 본격적으로 켜지기(MainWindow를 띄우기) 직전에 실행되는 함수입니다. protected override void OnStartup(StartupEventArgs e) { // 우리 프로그램만의 고유한 열쇠 이름 (절대 겹치지 않을 만한 이름으로 짓습니다) const string mutexName = "AudioBotProject_Unique_Mutex_Key_12345"; bool isNewInstance; // 컴퓨터 전체를 통틀어서 저 이름의 열쇠가 있는지 확인하고, 없으면 내가 가집니다. _mutex = new Mutex(true, mutexName, out isNewInstance); // 만약 내가 새로운 열쇠를 만든 게 아니라면? (이미 다른 애가 열쇠를 들고 켜져 있다면?) if (!isNewInstance) { // 경고창을 띄우고 MessageBox.Show("프로그램이 이미 실행 중입니다!", "중복 실행 방지", MessageBoxButton.OK, MessageBoxImage.Warning); // 메인 화면을 띄우기도 전에 프로그램을 즉시 강제 종료해버립니다. Application.Current.Shutdown(); return; } // 내가 첫 번째 실행이라면, 정상적으로 원래 하던 일(MainWindow 띄우기)을 계속합니다. base.OnStartup(e); } } }