System.Threading.Mutex mutex;//注意,此變數要定義為成員變數,而不是局部變數
bool CheckMultiInstance()
{
bool createdNew = true;
mutex = new System.Threading.Mutex(true, "_TEST_Mutex_", out createdNew);//這種在系統多使用者下,每個使用者能啟動一個程式進程。
mutex = new System.Threading.Mutex(true, "Global\\_TEST_Mutex_", out createdNew);//這種在系統中,不管幾個使用者,只能存在一個這樣的程式進程
if (!createdNew)
{
MessageBox.Show("Program is already running.");
}
return createdNew;
}
/// <summary>
/// Is exist same process
/// </summary>
/// <returns></returns>
public static Process GetExistProcess()
{
try
{
var current = Process.GetCurrentProcess();
var pArrayy = System.Diagnostics.Process.GetProcessesByName(current.ProcessName);
if (pArrayy == null || pArrayy.Length == 0)
{
return null;
}
foreach (var item in pArrayy)
{
try
{
/**** 這種判斷方法,有BUG,當第一次以管理員啟動,第二次不以管理員啟動時,將會有訪問被拒絕的異常拋出
if (!item.ProcessName.ToUpper().Contains(current.ProcessNameToUpper()))
{
continue;
}
if (item.Id != current.Id && item.MainModule.ModuleName.ToUpper() == current.MainModule.ModuleName.ToUpper())
{
return item;
}
**** */
///改成一下方法可解決許可權問題
if(item.MainWindowHandle!=Intptr.Zero)///此時已存在的進程主視窗控制代碼是有值的,而第二次的APP雖然起來了,但是視窗還沒有Show出來,是沒有主視窗控制代碼的
{
return item;
}
}
catch (Exception er)
{
LogHelper.WriteException(er);
continue;
}
}
}
catch (Exception ex)
{
LogHelper.WriteException(ex);
}
return null;
}
補充以管理員權限啟動:
privatevoidToShowExeAsAdmin()
{
try
{
stringstartPath="test.exe";
if (File.Exists(startPath))
{
ProcessStartInfostartInfo=newProcessStartInfo();
startInfo.FileName=startPath;
startInfo.UseShellExecute=true;
startInfo.Verb="runas";// 用admin許可權啟動新進程
System.Diagnostics.Process.Start(startInfo);//use admin
}
}
catch (Exceptionex)
{
LogHelper.WriteException(ex);
}
}