[英]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);
}
}
现在,关于您的问题,有两种解决方案:
创建一个方法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
传递给它。
将私有字段添加到您的类中, 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.