C#实战030:如何区分前后台同名进程

      最近有个程序一直在后台运行,每次运行都有好几个进程并且占用了电脑的大部分内存,导致电脑运行特别卡,但是有不能完全关闭,所以我就想关闭其他后台进程,只保留前台的进程。

     这里我用的是Process类,引用using System.Diagnostics;即可使用。通过Process可以获取到进程的以下属性:

 名称           说明 
   BasePriority   获取关联进程的基本优先级。  
   Container    获取 IContainer,它包含 Component。 (从 Component 继承。)  
    EnableRaisingEvents   获取或设置在进程终止时是否应激发 Exited 事件。  
    ExitCode   获取关联进程终止时指定的值。  
   ExitTime   获取关联进程退出的时间。  
   Handle   返回关联进程的本机句柄。  
   HandleCount   获取由进程打开的句柄数。  
    HasExited   获取指示关联进程是否已终止的值。  
    Id   获取关联进程的唯一标识符。  
   MachineName   获取关联进程正在其上运行的计算机的名称。  
   MainModule   获取关联进程的主模块。  
    MainWindowHandle   获取关联进程主窗口的窗口句柄。  
   MainWindowTitle   获取进程的主窗口标题。  
   MaxWorkingSet   获取或设置关联进程的允许的最大工作集大小。  
   MinWorkingSet   获取或设置关联进程的允许的最小工作集大小。  
   Modules   获取已由关联进程加载的模块。  
   NonpagedSystemMemorySize   获取分配给此进程的未分页的系统内存大小。  
   NonpagedSystemMemorySize64   获取为关联的进程分配的非分页系统内存量。  
   PagedMemorySize   获取分页的内存大小。  
   PagedMemorySize64    获取为关联的进程分配的分页内存量。 
  PagedSystemMemorySize64   获取为关联的进程分配的可分页系统内存量。  
   PeakPagedMemorySize64   获取关联的进程使用的虚拟内存分页文件中的最大内存量。  
   PeakVirtualMemorySize64   获取关联的进程使用的最大虚拟内存量。  
   PeakWorkingSet   获取关联进程的峰值工作集大小。  
   PeakWorkingSet64   获取关联的进程使用的最大物理内存量。  
   PriorityBoostEnabled   获取或设置一个值,该值指示主窗口拥有焦点时是否由操作系统暂时提升关联进程的优先级。  
   PriorityClass   获取或设置关联进程的总体优先级类别。  
   PrivateMemorySize64   获取为关联的进程分配的专用内存量。  
   PrivilegedProcessorTime   获取此进程的特权处理器时间。  
   ProcessName   获取该进程的名称。  
   ProcessorAffinity   获取或设置一些处理器,此进程中的线程可以按计划在这些处理器上运行。  
    Responding   获取指示进程的用户界面当前是否响应的值。  
   SessionId   获取关联的进程的终端服务会话标识符。  
    Site    获取或设置 Component 的 ISite。 (从 Component 继承。)  
   StandardError   获取用于读取应用程序错误输出的流。  
   StandardInput   获取用于写入应用程序输入的流。  
   StandardOutput   获取用于读取应用程序输出的流。  
    StartInfo   获取或设置要传递给 Process 的 Start 方法的属性。  
   StartTime   获取关联进程启动的时间。  
   SynchronizingObject   获取或设置用于封送由于进程退出事件而发出的事件处理程序调用的对象。  
   Threads     获取在关联进程中运行的一组线程。
   TotalProcessorTime   获取此进程的总的处理器时间。  
   UserProcessorTime   获取此进程的用户处理器时间。  
   VirtualMemorySize64   获取为关联的进程分配的虚拟内存量。  
   WorkingSet    获取关联进程的物理内存使用情况。 
   WorkingSet64    获取为关联的进程分配的物理内存量。

    但是研究了这些属性之后发现,这个程序的属性随时在变动,很难捕捉到唯一值,进程名又相同,本来想用PID区分的,但是后来发现PID是动态分配的,不是固定的,进程结束后PID被系统回收,以便继续分配给新的进程。所以不可能永久的用PID来进行区分。后来尝试用内存来分区,发现每个进程每次运行所消耗的内存都不一样,压根没法定位到想要的进程,想通过路径来识别结果每个进程都是统一路径的。。。后面试了好多的属性,都没法锁定统一个进程。

    终于今天被我发现了一个属性,那就是MainWindowTitle(获取进程的主窗口标题),因为前台应用只有一个,其他的进程都是在后台启动的,所以 窗口标题只有一个,我们只要找到这个有标题的进程,将其排除,其他的进程杀掉即可。

下面是完整代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.IO;

namespace Process
{
    class Program
    {
        static void Main(string[] args)    
        {
            string pName = "进程名称";
            string winName = "窗口标题名称";
            Process[] pro = Process.GetProcessesByName(pName); //获取进程名为“****”的进程
            int count = pro.Length; //获取进程数量
            // Console.WriteLine(count);
            try
            {
                for (int i = 0; i < count; i++)
                {
                    string title = pro[i].MainWindowTitle; //获取进程的窗口标题
                    Console.WriteLine("进程窗口标题:{0}", title);
                    if (title != winName)      //判断此进程是否是要查找的进程,如果不是就杀掉该进程
                    {
                        pro[i].Kill();    //杀掉进程
                    }
                }
            }
            catch (Exception)
            {

                throw;
            }
            //Console.ReadKey();
        }
    }
}

欢迎关注本人的公众号:编程手札,文章也会在公众号更新

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ProgramNotes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值