当前位置: 首页 > 编程语言 > C#

检测应用程序的另一个实例是否已经在运行Share

时间:2023-04-11 02:42:37 C#

检测应用程序的另一个实例是否已经在运行如果已经有一个实例在运行,我的应用程序在加载时需要表现得略有不同。我了解如何使用互斥锁来防止加载其他实例,但这并不能完全解决我的问题。例如:有什么想法吗?值得庆幸的是,它不需要处理多个用户帐户或类似的事情。(C#,桌面应用程序)编辑:澄清一下,该应用程序不需要限于单个实例,它只是在另一个实例已在运行时执行略有不同的启动操作。多个实例很好(并且是预期的)。这可能会做你想要的。它有很好的附加功能来推进已经运行的实例。编辑:更新代码以自动确定应用程序标题。使用系统;使用系统诊断;使用System.Linq;使用System.Reflection;使用System.Runtime.InteropServices;staticvoidMain(){if(!EnsureSingleInstance()){返回;}//...}staticboolEnsureSingleInstance(){ProcesscurrentProcess=Process.GetCurrentProcess();varrunningProcess=(fromprocessinProcess.GetProcesses()whereprocess.Id!=currentProcess.Id&&process.ProcessName.Equals(currentProcess.ProcessName,StringComparison.Ordinal)selectprocess).FirstOrDefault();如果(runningProcess!=null){ShowWindow(runningProcess.MainWindowHandle,SW_SHOWMAXIMIZED);SetForegroundWindow(runningProcess.MainWindowHandle);返回假;}返回真;}[DllImport("user32.dll",EntryPoint="SetForegroundWindow")]privatestaticexternboolSetForegroundWindow(IntPtrhWnd);[DllImport("user32.dll")]privatestaticexternBooleanShowWindow(IntPtrhWnd,Int32nCmdShow);私人常量intSW_SHOWMAXIMIZED=3;另一种方法是检测运行实例,详细有关在第二次尝试时激活第一个实例的示例,请参阅ScottHanselman的博客但是,如果这是您想要的,停止第二个实例应该不难。尝试使用信号量而不是互斥锁在使用CreateMutex()创建互斥锁后,您可以检查GetLastError()吗?如果它返回ERROR_ALREADY_EXISTS,则说明有另一个正在运行的应用程序实例。根据http://msdn.microsoft.com/en-us/library/ms682411%28VS.85%29.aspx,如果互斥量是一个命名的互斥量并且对象在这个函数调用之前存在,那么返回值是一个现有对象的句柄,GetLastError返回ERROR_ALREADY_EXISTS,bInitialOwner被忽略,调用线程未被授予所有权。但是,如果调用者的访问权限有限,该函数将失败并显示ERROR_ACCESS_DENIED,调用者应使用OpenMutex函数。编辑:抱歉,刚刚意识到这是一个C#/.Net问题。在.Net中,使用返回createdNew标志的Mutex构造函数,http://msdn.microsoft.com/en-us/library/bwe34f1k%28VS.80%29.aspx:publicMutex(boolinitiallyOwned,stringname,outboolcreatedNew)一个好方法是使用Sandor的解决方案,但使用WMI获取进程列表,如下所述:C#:Howtogetthefullpathofarunningprocess?(杰夫的解决方案)。这样还可以检查其他运行的实例是否匹配路径和远程终端会话id:需要详细了解C#学习教程,希望大家多多关注—staticboolEnsureSingleInstance(){ProcesscurrentProcess=Process.GetCurrentProcess();varwmiQueryString="SELECTProcessId,ExecutablePath,CommandLineFROMWin32_Process";使用(varsearcher=newManagementObjectSearcher(wmiQueryString))使用(varresults=searcher.Get()){varquery=frompinProcess.GetProcesses()(uint)mo["ProcessId"]selectnew{Process=p,Path=(string)mo["ExecutablePath"],CommandLine=(string)mo["CommandLine"],};varrunningProcess=(fromprocessinquerywhereprocess.Process.Id!=currentProcess.Id&&process.Process.ProcessName.Equals(currentProcess.ProcessName,StringComparison.Ordinal)&&process.Path==currentProcess.MainModule.FileName&&进程。Process.SessionId==currentProcess.SessionId选择进程).FirstOrDefa终极();返回runningProcess==null;}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: