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 |