반응형
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.
반응형
'programing' 카테고리의 다른 글
EC2 : 보안 그룹에 포트 8080을 추가하는 방법은 무엇입니까? (0) | 2020.11.30 |
---|---|
스크럼에서 QA가 작동하는 방식을 이해하도록 도와주세요. (0) | 2020.11.30 |
Python, 출력에서 소수점 이하 두 자리까지 모든 부동 소수점 인쇄 (0) | 2020.11.30 |
C 헤더 파일을 어떻게 만들 수 있습니까? (0) | 2020.11.30 |
Generic Intellisense의 새롭고 완전한 구현 (0) | 2020.11.30 |