C#处理终止通知

C#处理终止通知,c#,events,process,exit,terminate,C#,Events,Process,Exit,Terminate,我目前正在寻找一种方法,在特定进程关闭时删除某个文件。我已经找到了很多创建流程和为退出的添加事件处理程序的示例,但我需要得到系统中任何流程的通知,而不仅仅是我创建的流程 有人能解释一下这是如何实现的吗?我对你的问题很感兴趣,所以我为它写了一个小应用程序,希望你觉得它有用。可以在很多方面进行改进:) 类程序 { 私有静态只读列表allprocesss=new List(); 静态void Main(字符串[]参数) { var定时器=新定时器(1000); timer.AutoReset=true

我目前正在寻找一种方法,在特定进程关闭时删除某个文件。我已经找到了很多创建流程和为退出的
添加事件处理程序的示例,但我需要得到系统中任何流程的通知,而不仅仅是我创建的流程


有人能解释一下这是如何实现的吗?

我对你的问题很感兴趣,所以我为它写了一个小应用程序,希望你觉得它有用。可以在很多方面进行改进:)

类程序
{
私有静态只读列表allprocesss=new List();
静态void Main(字符串[]参数)
{
var定时器=新定时器(1000);
timer.AutoReset=true;
timer.appeased+=(发送方、事件参数)=>
{
Process[]processSnapShot=Process.getprocesss();
var newprocesss=processSnapShot.Where(p=>!allprocesss.Select(p2=>p2.Id).Contains(p.Id));
WireHandler(新流程);
allprocesss.AddRange(newprocesss);
};
var processs=Process.getprocesss();
线处理器(工艺);
timer.Start();
Console.ReadLine();
}
私有静态void WireHandler(IEnumerable进程)
{
foreach(过程中的var过程)
{
尝试
{
Console.WriteLine(“进程已启动”+Process.ProcessName);
process.EnableRaisingEvents=true;
process.Exited+=processonexitted;
}
捕获(例外e)
{
Console.WriteLine(“发生错误”+e.Message);
}
}
}
私有静态void ProcessOnExited(对象发送方,EventArgs EventArgs)
{
var进程=(进程)发送方;
所有进程。删除(进程);
Console.WriteLine(“进程退出”+Process.ProcessName);
}
}

建立所有运行进程的列表,定期更新,比较差异。这将错过在两个时间间隔之间潜入的短期程序,但我不知道如何才能做到这一点。如果您对特定流程感兴趣,请使用。然后将它们连接起来,正如罗斯金在下面的示例中所演示的那样。。。
class Program
{
    private static readonly List<Process> AllProcesses = new List<Process>();

    static void Main(string[] args)
    {
        var timer = new Timer(1000);
        timer.AutoReset = true;
        timer.Elapsed += (sender, eventArgs) =>
        {
            Process[] processSnapShot = Process.GetProcesses();
            var newProcesses = processSnapShot.Where(p => !AllProcesses.Select(p2 => p2.Id).Contains(p.Id));

            WireHandler(newProcesses);

            AllProcesses.AddRange(newProcesses);
        };

        var processes = Process.GetProcesses();
        WireHandler(processes);

        timer.Start();
        Console.ReadLine();
    }

    private static void WireHandler(IEnumerable<Process> processes)
    {
        foreach (var process in processes)
        {
            try
            {
                Console.WriteLine("Process started " + process.ProcessName);
                process.EnableRaisingEvents = true;
                process.Exited += ProcessOnExited;
            }
            catch (Exception e)
            {
                Console.WriteLine("Error occurred " + e.Message);
            }
        }
    }

    private static void ProcessOnExited(object sender, EventArgs eventArgs)
    {
        var process = (Process) sender;
        AllProcesses.Remove(process);

        Console.WriteLine("Process exited " + process.ProcessName);
    }
}