最近有个程序一直在后台运行,每次运行都有好几个进程并且占用了电脑的大部分内存,导致电脑运行特别卡,但是有不能完全关闭,所以我就想关闭其他后台进程,只保留前台的进程。
这里我用的是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();
}
}
}
欢迎关注本人的公众号:编程手札,文章也会在公众号更新