Bilgisayar üzerinde çalışan işlemleri görebileceğimiz ve istediğimizi sonlandırabileceğimiz bir uygulama yapacağız. Program üzerinden yeni bir işlem başlatabileceğiz. Ayriyeten yasaklılar listesine aldığımız işlemleri sürekli takip edip çalışmaya başladıklarında otomatik kapatan bir sistem yapacağız. Bu yüzden gelişmiş görev yöneticisi demeyi tercih ettim. :)

C# - Gelişmiş Görev Yöneticisi Yapma (Task Manager)
Hazırladığım form böyle görünüyor.

Başlamadan önce, Process sınıfını kullanabilmek için projeye gerekli isim uzayını ekleyelim.

using System.Diagnostics;

Ardından form tasarımını istediğiniz gibi yapın. Ben yukarıdaki örnek üzerinden gideceğim. Ayriyeten forma bir tane Timer nesnesi ekleyin.

Gerekli Methodlar

Önce Form1 içinde, çalışan tüm işlemleri alıp listBox1 içine listeleyen methodu yazalım.

private void getProcesses()
{
    Process[] processes = Process.GetProcesses();

    listBox1.Items.Clear();
    foreach (Process process in processes)
    {
        listBox1.Items.Add(process.ProcessName);
    }
}

Çalışan işlemleri GetProcesses methodu ile aldıktan sonra bir Process dizisine attık. Sonra listBox1 elemanlarını temizleyip dizideki işlemleri teker teker yazdırdık.

Şimdi listBox1 içinden seçili olan işlemi sonlandıracak methodu yazalım.

private void killSelectedProcesses()
{
    DialogResult dialogResult = MessageBox.Show("İşlemi sonlandırmak istiyor musunuz?", "Dikkat", MessageBoxButtons.YesNo);

    if (dialogResult.Equals(DialogResult.Yes))
    {
        var processName = listBox1.SelectedItem;
        Process[] processes = Process.GetProcessesByName(processName.ToString());

        foreach (Process process in processes)
        {
            Debug.WriteLine("İşlem sonlandırıldı: " + process.ProcessName);
            process.Kill();
        }

        MessageBox.Show("İşlem sonlandırıldı: " + processName, "Başarılı");
    }            
}

Önce, kullanıcıya işlemi sonlandırmak isteyip istemediğini sorup dönen cevabı dialogResult içinde sakladık. Ardından gelen cevap DialogResult.Yes ise yani kullanıcı kabul etmişse; listBox1 içinden seçilen işlem adını alıp GetProcessesByName methodu ile o isimli tüm işlemleri yakaladık. Sonra da bir döngü yardımıyla yakalanan tüm işlemleri teker teker sonlandırdık ve Debug.WriteLine ile log olarak yazdırdık.

Yasaklanan işlemler listBox2 içinde görüntülenecek. Şimdi bu işlemleri sonlandıracak methodu yazalım.

private void killBannedProcesses()
{
    foreach (string processName in listBox2.Items)
    {
        Process[] processes = Process.GetProcessesByName(processName);

        foreach (Process process in processes)
        {
            Debug.WriteLine("İşlem sonlandırıldı: " + process.ProcessName);
            process.Kill();
        }
    }
}

Bir döngü ile listBox2 içindeki tüm elemanları dolaşıp hepsi için teker teker o isimli işlemleri yakalayıp sonlandırdık. Aslında bir bakıma killSelectedProcesses methodu ile aynı işlemi yaptık.

Son olarak aldığı parametreye göre button1 ve button2 -sonlandır ve yasakla- butonlarının aktif/pasif olma durumunu ayarlayan bir method yazalım.

private void setButtonsEnabledState(bool state)
{
    button1.Enabled = state;
    button2.Enabled = state;
}

Olaylar (Events)

Önce Form1_Load içinde setButtonsEnabledState ile sonlandır ve yasakla butonlarını pasif yapalım. Form içine eklediğimiz Timer nesnesinin Interval özelliğini 10.000 MS (10 saniye) yapalım ve Start ile başlatalım. Sonra da getProcesses ile çalışan işlemleri listeleyelim.

private void Form1_Load(object sender, EventArgs e)
{
    this.setButtonsEnabledState(false);

    timer1.Interval = 10000;
    timer1.Start();

    this.getProcesses();
}

Şimdi timer1_Tick olayında, yani her on saniyede bir getProcesses ile çalışan işlemleri listeleyip, killBannedProcesses ile yasaklanmış işlemleri sonlandırdıktan sonra setButtonsEnabledState ile butonları pasif yapalım.

private void timer1_Tick(object sender, EventArgs e)
{
    this.getProcesses();
    this.killBannedProcesses();
    this.setButtonsEnabledState(false);
}

Sonlandır butonuna tıklandığında (butona tıklayıp içine girin) seçili işlemi sonlandıran killSelectedProcesses methodunu çağıralım.

private void button1_Click(object sender, EventArgs e)
{
    this.killSelectedProcesses();
}

Yasakla butonuna tıklandığında listBox1 içinden seçili işlemi eğer listBox2 içinde yoksa oraya taşıyalım ve killBannedProcesses ile yasaklı işlemleri sonlandıralım.

private void button2_Click(object sender, EventArgs e)
{
    string processName = listBox1.SelectedItem.ToString();

    if (listBox2.Items.Contains(processName))
    {
        MessageBox.Show("Bu işlemi zaten yasakladınız.", "Hata");
        return;
    }

    listBox2.Items.Add(processName);
    this.killBannedProcesses();
}

Şimdi, listBox1_KeyDown olayında -yani bir tuşa basıldığında- eğer basılan tuş DELETE ise killSelectedProcesses methodu ile seçili işlemi sonlandıracağız.

private void listBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyData.Equals(Keys.Delete))
    {
        this.killSelectedProcesses();
    }
}

Bir elementin olaylarına erişmek için, elemente (burada ListBox) sağ tıklayıp Properties dedikten sonra sağ alt kısımdaki panelden yıldırım ikonuna tıklayın. Açılan listede o elemente ait olayları görüyor olacaksınız. Listeden KeyDown olayını bulup karşısındaki boşluğa çift tıklarsanız Visual Studio olayın methodunu oluşturacaktır.

Properties (özellikler) paneli ve olaylar (events) butonu.
Properties (özellikler) paneli ve olaylar (events) butonu.

Şimdi listBox2 içinde DELETE tuşuna basıldığında sadece seçili işlemin listeden silinmesini sağlayacağız. Böylece yasaklanan işlemin yasağı kalkmış olacak. Az önce yaptığınız gibi listBox2 için de KeyDown olayı oluşturalım.

private void listBox2_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyData.Equals(Keys.Delete))
    {
        listBox2.Items.Remove(listBox2.SelectedItem);
    }
}

Bir işlem seçildiğinde ya da seçim bırakıldığında listBox1 içindeki seçili eleman sayısına göre butonları aktif/pasif yapalım.

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    this.setButtonsEnabledState(listBox1.Items.Count > 0);
}

Parametre olarak gönderilen listBox1.Items.Count > 0 ifadesi eğer listBox1 içinde seçili eleman varsa true yoksa false üretecek.

Yeni Görev Formu

Sağ taraftaki Solution Explorer panelinde projenin üzerine sağ tıklayıp Add > New Item... seçeneğini seçin. Karşınıza gelen pencerede Windows Form seçeneğini seçik OK deyin.

Yeni Görev Formu
Yeni oluşturduğumuz form.

Yeni formda bir tane TextBox bir tane de Button eklemeniz yeteri.

Form2 içinde yeni işlemi başlatacak methodu oluşturalım.

private void startNewTask()
{
    try
    {
        Process.Start(textBox1.Text.Trim());
    }
    catch (Exception ex)
    {
        MessageBox.Show("Sistem belirtilen dosyayı bulamadı.", "Hata");

        Debug.WriteLine(ex.Message);
    }

    this.Dispose();
}

Form açıldığında butonun pasif olmasını sağlayalım.

private void Form2_Load(object sender, EventArgs e)
{
    button1.Enabled = false;
}

Butona tıklanıldığında yeni görev oluşturan methodu çalıştıralım.

private void button1_Click(object sender, EventArgs e)
{
    this.startNewTask();
}

Son olarak textBox1_KeyDown olayında eğer basılan tuş ENTER ise yeni görev methodunu çağıralım. Eğer textBox1 içinde metin varsa buton aktif (true) yoksa pasif (false) olacak.

Tekrar Form1'e dönelim ve button3 (Yeni Görev) butonuna çift tıklayıp Click olayını oluşturalım ve içinde Form2'nin bir örneğini oluşturup kullanıcıya gösterelim.

private void button3_Click(object sender, EventArgs e)
{
    using (Form2 newTaskForm = new Form2())
    {
        newTaskForm.ShowDialog();
    }
}

İşte bu kadar! Gelişmiş(!) görev yöneticisi artık hazır. Kullandığım ikonları iconfinderdan aldım.

Örneğin kaynak kodlarını indirmek isteyenler TaskManagerExample1.rar linkine tıklayabilir.