C# 在C中标识自己的进程名称#

C# 在C中标识自己的进程名称#,c#,process,C#,Process,为了防止用户运行我的应用程序的多个实例,我使用以下代码:- Process[] pArry = Process.GetProcesses(); int nCount = 0; foreach (Process p in pArry) { string ProcessName = p.ProcessName; ProcessName = ProcessName.ToLow

为了防止用户运行我的应用程序的多个实例,我使用以下代码:-

 Process[] pArry = Process.GetProcesses();
           int nCount = 0;
           foreach (Process p in pArry)
           {
               string ProcessName = p.ProcessName;
               ProcessName = ProcessName.ToLower();
               if (ProcessName.CompareTo("myApp") == 0)
               {
                   nCount++;
               }
           }   
           if (nCount > 1)
           {
               MessageBox.Show(AppAlreadyRunning,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error);
               Process.GetCurrentProcess().Kill();
           }
但是我们知道,如果更改exe名称,进程名称也会更改。 因此,如果用户将“myApp.exe”更改为“UserApp.exe”,此修补程序将无法运行! 有什么出路吗

我在VS2010中使用C#。
谢谢

这是一个非常简单的过程。调用此函数将返回一个进程类,其中包含所需的所有信息

Process.GetCurrentProcess()
这里有一些代码给你

       Process[] pArry = Process.GetProcesses();
       foreach (Process p in pArry)
       {
           if (p.Id == Process.GetCurrentProcess().Id)
                continue;
           string ProcessName = p.ProcessName;
           if(ProcessName == Process.GetCurrentProcess().ProcessName)
           {
                MessageBox.Show(AppAlreadyRunning,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error)
                SetForegroundWindow(p.MainWindowHandle);
                Application.Exit();
           }
       }   

我打赌你可以使用Process.GetCurrentProcess()(就像你杀死进程一样)来获得实际名称并使用它进行比较。

这些问题看起来很相似


谢谢……虽然我先搜索了,但还是找不到。。。这条线真的很有用+1使用内核模式构造(如互斥)无疑是实现这一点的方法(尽管使用信号量会稍微减少开销)。更改第二个实例的进程名可以很容易地避免依赖于进程名的检查。@Swand Purankar:虽然这确实回答了您的问题,但您确实应该考虑使用内核模式构造来完成此操作。即使您正在检查进程名称,用户也很容易为您的exe创建多个副本,每个副本都有不同的名称。在这种情况下,您的进程名检查不会阻止用户同时运行所有的exe。@AdamRalph虽然我几乎在一年半后回复,但我记得,我也使用了互斥体。。。谢谢你的评论!!:)