关于"如何让应用程序只有一个实例在运行"的孟宪会的解决方法的疑问
如何让应用程序只有一个实例,孟宪会的解决方法 (http://dotnet.aspx.cc/ShowDetail.aspx?id=E2A17727-765F-4346-8446-5D130622CB54) 主要思路是遍历与应用程序可执行文件同名的所有进程,判断该进程关联的主模块的完整路径(Process.MainModule.FileName属性)是否就是应用程序可执行文件所在路径,如果是就表明该应用程序已经有一个实例在运行了,则将该实例的主窗口置于最前,如果不是则建立实例。
判断进程关联的主模块的完整路径是否是应用程序可执行文件所在路径的方法是下面这条语句,疑问也在这里
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") ==current.MainModule.FileName)
Assembly.GetExecutingAssembly().Location是获得当前代码从中运行的程序集的完整路径,current.MainModule.FileName是当前进程基本模块的完整路径,这里的当前进程也就是当前代码运行的进程,因此这条语句始终都是为真,这条语句应该写为
if (process.MainModule.FileName == current.MainModule.FileName)
判断两个进程的基本模块完整路径是否相同以确定应用程序的实例是否已经运行了。
此外,该方法在找到了前一个运行实例后,将该窗口置为正常状态(最大化和最小化之外的状态)
public static void HandleRunningInstance(Process instance)
{ //确保窗口没有被最小化或最大化
ShowWindowAsync (instance.MainWindowHandle , WS_SHOWNORMAL);
//设置真实例程为foreground window
SetForegroundWindow (instance.MainWindowHandle);
}
相比之下,下面这种做法更好:
判断窗口的状态,如果为最小化,则还原
浙公网安备 33010602011771号