您的位置:首页 > 编程语言 > C#

C#判断当前启动程序进程是否存在

2013-06-17 16:00 771 查看
原文:

http://blog.csdn.net/haylhf/article/details/7842087

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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: