C# - Gelişmiş Görev Yöneticisi Yapma
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. :)
Başlamadan önce, Process
sınıfını kullanabilmek için projeye gerekli isim uzayını ekleyelim.
1.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.
1.private void getProcesses() 2.{ 3. Process[] processes = Process.GetProcesses(); 4. 5. listBox1.Items.Clear(); 6. foreach (Process process in processes) 7. { 8. listBox1.Items.Add(process.ProcessName); 9. } 10.}
Ç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.
1.private void killSelectedProcesses() 2.{ 3. DialogResult dialogResult = MessageBox.Show("İşlemi sonlandırmak istiyor musunuz?", "Dikkat", MessageBoxButtons.YesNo); 4. 5. if (dialogResult.Equals(DialogResult.Yes)) 6. { 7. var processName = listBox1.SelectedItem; 8. Process[] processes = Process.GetProcessesByName(processName.ToString()); 9. 10. foreach (Process process in processes) 11. { 12. Debug.WriteLine("İşlem sonlandırıldı: " + process.ProcessName); 13. process.Kill(); 14. } 15. 16. MessageBox.Show("İşlem sonlandırıldı: " + processName, "Başarılı"); 17. } 18.}
Ö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.
1.private void killBannedProcesses() 2.{ 3. foreach (string processName in listBox2.Items) 4. { 5. Process[] processes = Process.GetProcessesByName(processName); 6. 7. foreach (Process process in processes) 8. { 9. Debug.WriteLine("İşlem sonlandırıldı: " + process.ProcessName); 10. process.Kill(); 11. } 12. } 13.}
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.
1.private void setButtonsEnabledState(bool state) 2.{ 3. button1.Enabled = state; 4. button2.Enabled = state; 5.}
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.
1.private void Form1_Load(object sender, EventArgs e) 2.{ 3. this.setButtonsEnabledState(false); 4. 5. timer1.Interval = 10000; 6. timer1.Start(); 7. 8. this.getProcesses(); 9.}
Ş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.
1.private void timer1_Tick(object sender, EventArgs e) 2.{ 3. this.getProcesses(); 4. this.killBannedProcesses(); 5. this.setButtonsEnabledState(false); 6.}
Sonlandır butonuna tıklandığında (butona tıklayıp içine girin) seçili işlemi sonlandıran killSelectedProcesses
methodunu çağıralım.
1.private void button1_Click(object sender, EventArgs e) 2.{ 3. this.killSelectedProcesses(); 4.}
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.
1.private void button2_Click(object sender, EventArgs e) 2.{ 3. string processName = listBox1.SelectedItem.ToString(); 4. 5. if (listBox2.Items.Contains(processName)) 6. { 7. MessageBox.Show("Bu işlemi zaten yasakladınız.", "Hata"); 8. return; 9. } 10. 11. listBox2.Items.Add(processName); 12. this.killBannedProcesses(); 13.}
Ş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.
1.private void listBox1_KeyDown(object sender, KeyEventArgs e) 2.{ 3. if (e.KeyData.Equals(Keys.Delete)) 4. { 5. this.killSelectedProcesses(); 6. } 7.}
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.
Ş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.
1.private void listBox2_KeyDown(object sender, KeyEventArgs e) 2.{ 3. if (e.KeyData.Equals(Keys.Delete)) 4. { 5. listBox2.Items.Remove(listBox2.SelectedItem); 6. } 7.}
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.
1.private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 2.{ 3. this.setButtonsEnabledState(listBox1.Items.Count > 0); 4.}
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 formda bir tane TextBox
bir tane de Button
eklemeniz yeteri.
Form2 içinde yeni işlemi başlatacak methodu oluşturalım.
1.private void startNewTask() 2.{ 3. try 4. { 5. Process.Start(textBox1.Text.Trim()); 6. } 7. catch (Exception ex) 8. { 9. MessageBox.Show("Sistem belirtilen dosyayı bulamadı.", "Hata"); 10. 11. Debug.WriteLine(ex.Message); 12. } 13. 14. this.Dispose(); 15.}
Form açıldığında butonun pasif olmasını sağlayalım.
1.private void Form2_Load(object sender, EventArgs e) 2.{ 3. button1.Enabled = false; 4.}
Butona tıklanıldığında yeni görev oluşturan methodu çalıştıralım.
1.private void button1_Click(object sender, EventArgs e) 2.{ 3. this.startNewTask(); 4.}
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.
1.private void button3_Click(object sender, EventArgs e) 2.{ 3. using (Form2 newTaskForm = new Form2()) 4. { 5. newTaskForm.ShowDialog(); 6. } 7.}
İş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.
Yorumlar
Yorum Gönder