繁体   English   中英

C# 检测关闭应用程序

[英]C# Detect Closing Application

我正在尝试创建任务栏替换,并且我想要每个正在运行的应用程序的按钮。

public void AddBtn(string name) {
        Button newButton = new Button();
        this.Controls.Add(newButton);
        newButton.Location = new Point(count * 75, Screen.PrimaryScreen.Bounds.Height - 25);
        newButton.Text = name;
        newButton.Name = count.ToString();
        newButton.BringToFront();
        count++;
    }

    private void GetRunning()
    {
        Process[] processes = Process.GetProcesses();
        foreach (Process process in Process.GetProcesses().Where(p => !string.IsNullOrEmpty(p.MainWindowTitle)).ToList())
            AddBtn(process.ProcessName);
    }

这就是我到目前为止所拥有的,它为每个正在运行的应用程序创建一个按钮。 我需要检测其中一个应用程序是否关闭,以便我可以删除与其对应的按钮。 如果您认为有更好的方法可以做到这一点,请告诉我。

首先,最好将用于添加按钮的代码移到别处,并且只使用GetRunning来获取当前正在运行的进程。 像这样修改它:

private List<Process> GetRunning()
{
    return Process.GetProcesses().Where(p => !string.IsNullOrEmpty(p.MainWindowTitle)).ToList();
}

private void AddButtons()
{
    for (var process in this.GetRunning())
    {
        AddBtn(process.ProcessName);
    }
}

现在,关于您的问题,有两种解决方案:

解决方案 1:使用事件

创建一个方法HandleClosed ,它处理进程退出时需要完成的所有操作:

private void HandleClosed(Process sender, EventArgs e)
{
    // Stuff
}

然后,您可以将其绑定到进程的Exited事件,如下所示:

private void BindProcesses()
{
    foreach (var process in this.GetRunning())
    {
        process.EnableRaisingEvents = true;
        process.Exited += this.HandleClosed;
    }
}

现在,每当其中一个进程退出时, HandleClosed将被调用,关闭的进程将通过sender传递给它。

解决方案 2:自己管理

将私有字段添加到您的类中, private List<Process> prevProcesses; .

然后创建一个新方法GetClosed

private List<Process> GetClosed()
{
    var current = GetRunning();
    var result = this.prevProcesses.Except(current);
    this.prevProcesses = current;
    return result.ToList();
}

此方法的作用是获取当前正在运行的进程,然后将该枚举与prevProcesses进行比较。 prevProcesses但不在current中的进程是已经关闭的进程。 然后,它使用当前枚举更新prevProcesses

最后,在您的构造函数或您用于初始化的任何其他方法中获取prevProcesses的初始值:

this.prevProcesses = this.GetRunning();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM