[英]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.