본문 바로가기
C#(CSharp)/WPF

Mutex를 이용해서 1개의 프로세스만 동작하도록 하기

by swconsulting 2015. 3. 22.

Mutex를 이용해서 1개의 프로그램만 실행할 수 있는 방법을 알아보겠습니다.


[RunOneInstance.cs]

using System;

using System.Linq;

using System.Runtime.InteropServices;

using System.Reflection;

using System.Security.AccessControl;

using System.Security.Principal;

using System.Threading;

 

namespace CommonLib.Util

{

    public class RunOneInstance

    {

        private Mutex mutex;

 

        public bool CreateOnlyOneMutex(string mutexName)

        {

            bool canCreateNewMutex = false;

 

            // Application GUID  이용해서 Mutext 고유한 이름을 만든다.

            string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().

GetCustomAttributes(typeof(GuidAttribute), false).

GetValue(0)).Value.ToString();

 

            // Global prefix 붙여서 global mutex 만든다

            //string mutexId = string.Format("Global\\{{{0}}}", appGuid);

            string mutexId = "Global\\" + appGuid;

 

            // 보안 속성을 모든 사람이 사용할  있도록 셋팅한다.

            // 모든 사람이 접근 가능하므로 보안에 문제가 있을수 있다.

            var allowEveryoneRule = new MutexAccessRule(new SecurityIdentifier

(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow);

            var securitySettings = new MutexSecurity();

            securitySettings.AddAccessRule(allowEveryoneRule);

 

            //보안 속성을 추가해서 mutex 생성한다.

      //public Mutex(bool initiallyOwned, string name, out bool createdNew, MutexSecurity       

      //mutexSecurity);

            mutex = new Mutex(false, mutexId, out canCreateNewMutex, securitySettings);           

 

            return canCreateNewMutex;

        }

}

 

}


위 클래스를 WPF main 역할을 하는 App.xaml.cs에 OnStartup() 함수를 상속받아 구현후 아래 처럼 사용하면 됩니다.


[App.xaml.cs]

namespace SWConsultingStickyNote

{

    /// <summary>

    /// Interaction logic for App.xaml

    /// </summary>

    public partial class App : Application

    {

private RunOneInstance runOneApp = new RunOneInstance();

 

        protected override void OnStartup(StartupEventArgs e)

        {

            if (runOneApp.CreateOnlyOneMutex(null) == false)

            {

                MessageBox.Show("Already runnig SWConsulting Sticky Note~!

\r\nPlease, See Tray Icon.""SWCS Sticky Note"MessageBoxButton.OK);

                Environment.Exit(0);

                return;

            }

 

            base.OnStartup(e);

 

            //Create notify icon

            notifyIcon = (TaskbarIcon)FindResource("TrayIcon");           

        }

 

}


출처 : 다년간의 프로그램 개발 경험.



'C#(CSharp) > WPF' 카테고리의 다른 글

XAML Custom Namespace  (0) 2015.04.08
다국어 작업(Globalization, Localization)  (0) 2015.04.02
WPF 프로그램 UI 없이 자동으로 종료 되기  (0) 2015.03.21
UI 쓰레드 (UI Thread)  (0) 2015.03.21
Hidden/Collapsed 차이  (0) 2015.03.21