Arşiv

Etiketlenen yazılar event

C# Event fırlatmak için yeni bir yöntem

28 Temmuz 2010 2 yorum

C# ile geliştirdiğimiz sınıflardan event yayınlamaya genellikle ihtiyaç duyarız.

Bir sınıftan event yayınlamak için, artık ezberlediğimiz üzere, aşağıdaki yöntemi kullanırız;

public class EventTest
{
	public event EventHandler MyEvent;

	public void RaiseEvent()
	{
		if(MyEvent != null)
		{
			MyEvent(this, EventArgs.Empty);
		}
	}
}

Devlicious‘da gördüğüm makalede, Rob Eisenberg yeni bir yöntem öneriyor.

Makaleye göre, yukarıdaki event yayınlama kodunu aşağıdaki gibi de yazabiliriz;

public class EventTest
{
	public event EventHandler MyEvent = delegate {};

	public void RaiseEvent()
	{
		MyEvent(this, EventArgs.Empty);
	}
}

Sizce hangisini tercih etmeliyiz?

C# ile Network Activity Monitor yazalım

09 Temmuz 2010 2 yorum

Bilgisayarın network aktivitesini ölçmemiz gerektiğinde, bu görevi gerçekleştirecek bir yazılım geliştirebiliriz.

Yapmamız gereken Windows’un Performance Counter listesinden doğru sayaçları okumak. Bu yazımda böyle bir uygulama geliştireceğim.

Öncelikle bilgisayarda bulunan ağ arayüzlerinin listesini alalım;

string[] NetworkAdapter = new PerformanceCounterCategory("Network Interface").GetInstanceNames(); /// ağ arayüzlerinin listesi

Şimdi System.Diagnostics namespace’inde yeralan PerformanceCounter sınıfından yeni bir örnek çıkartıp, doğru sayaçlardan bilgi okuyabiliriz.

Bilgisayarın ağ üzerinden yaptığı download ve upload miktarını ölçmek için, Network Interface isimli Performance Counter‘ın Bytes Received ve Bytes Sent isimli sayaçlarını kullanacağız.

PerformanceCounter Download = new PerformanceCounter("Network Interface", "Bytes Received/sec", NetworkAdapter[1]);
PerformanceCounter Upload = new PerformanceCounter("Network Interface", "Bytes Sent/sec", NetworkAdapter[1]);

NetworkChange sınıfının static üyelerinden NetworkAvailabilityChanged event‘ine bir delegate method atayarak, bilgisayarın ağ bağlantı durumunda değişiklik olunca farketmesini sağlayabiliriz.

Yazdığımız uygulamada her 10 saniye’de bir bilgisayarın download ve upload miktarını ekrana yazacak olalım;

Timer t = new Timer(10000); /// 10 saniye

NetworkChange.NetworkAvailabilityChanged += delegate(object _sender, NetworkAvailabilityEventArgs _e) { /// network durumu değiştiğinde
	if (_e.IsAvailable) /// eğer network ulaşılabilir duruma geldi ise
	{
		t.Start(); ///başla
	}
	else
	{
		t.Stop(); /// dur
	}
};

Timer nesnesinin Elapsed event‘inde de ekrana download ve upload miktarı bilgilerini yazacağız;

t.Elapsed += delegate(object _sender, ElapsedEventArgs _e) {
	Console.WriteLine("Download : {0} kb.\t\tUpload : {1} kb.", Download.NextValue(), Upload.NextValue()); /// ekrana download & upload miktarını yaz
};

Örnek uygulamanın tüm kodu;

using System;
using System.Net.NetworkInformation;
using System.Timers;
using System.Diagnostics;

class Program
{
	static void Main(string[] args)
	{
		string[] NetworkAdapter = new PerformanceCounterCategory("Network Interface").GetInstanceNames(); /// network kartlarının listesi

		PerformanceCounter Download = new PerformanceCounter("Network Interface", "Bytes Received/sec", NetworkAdapter[1]);
		PerformanceCounter Upload = new PerformanceCounter("Network Interface", "Bytes Sent/sec", NetworkAdapter[1]);

		Timer t = new Timer(10000); /// 10 saniye
		t.Elapsed += delegate(object _sender, ElapsedEventArgs _e) {
			Console.WriteLine("Download : {0} kb.\t\tUpload : {1} kb.", Download.NextValue(), Upload.NextValue()); /// ekrana download & upload miktarını yaz
		};

		NetworkChange.NetworkAvailabilityChanged += delegate(object _sender, NetworkAvailabilityEventArgs _e) { /// network durumu değiştiğinde
			if (_e.IsAvailable) /// eğer network ulaşılabilir duruma geldi ise
			{
				t.Start(); ///başla
			}
			else
			{
				t.Stop(); /// dur
			}
		};

		t.Start();

		Console.ReadLine();
	}
}

LINQ ile Bilgisayara Kurulu Programları Sorgulamak

30 Ocak 2010 1 yorum

Bu yazımda, bilgisayarda kurulu programları, LINQ kullanarak nasıl sorgulayacağımızı inceleyeceğim.

Bilgisayara kurduğumuz her program bilgisayarın Registry‘sine kurulum ile ilgili bir kayıt bırakır.

Bilmeyenler için not: Registry’yi açmak için komut satırına regedit yazmanız yeterli.

Registry ile ilgili daha detaylı bilgi için MSDN: Registry sayfasına bakmanızı tavsiye ederim.

Registry‘nin LocalMachine\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall dalında, bilgisayara kurulu olan uygulamalara ve bu uygulamalar ile ilgili bilgilere ulaşılabilir.

Uygulamamızda, Registry class’ını kullanabilmek için, kodumuza aşağıdaki namespace’i eklememiz gerekiyor.

using Microsoft.Win32;

Hemen form tasarlamakla başlayalım.

Bilgisayarda Kurulu Programlar Ana Form Ekran Görüntüsü

Yukarıdaki formu oluşturduktan sonra btnGetir butonunun Click olayına aşağıdaki kodu yazalım;

using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"))
{
	var programlar = from k in rk.GetSubKeyNames()
					 let r = rk.OpenSubKey(k)
					 select r.GetValue("DisplayName");

	foreach (string program in programlar)
		if (!string.IsNullOrWhiteSpace(program))
			lbProgramlar.Items.Add(program);
}

Registry sınıfının static LocalMachine üyesi üzerinden OpenSubKey() method’unu çağırıyoruz.

Daha sonra yaptığımız;

from k in rk.GetSubKeyNames()
let r = rk.OpenSubKey(k)
select r.GetValue("DisplayName");

LINQ sorgusunu yazmak oluyor. Bu sorgu, ilgili Registry dalının altında bulunan tüm dalları açar ve içlerindeki DisplayName anahtarının değerini getirir.

Son olarak basit bir foreach döngüsü ile bu değerleri lbProgramlar Listbox kontrolüne dolduruyoruz.

İşte benim bilgisayarımdaki sonuç;

Bilgisayarda Kurulu Programlar Çalıştıktan Sonraki Ekran Görüntüsü

C# Rezerve Methodlar – Reserved Methods

C# dilinin bazı yetenekleri, aslında uygulama geliştiricilerin göremedikleri method’lardan gelmektedir.

Eğer geliştirdiğiniz uygulamanın assembly’lerini ILDASM tool’u ile açıp incelerseniz, bu method çağrılarını görebilirsiniz.

Eğer bilerek veya yanlışlıkla bu method’lardan birisi ile aynı isme sahip method oluşturmaya çalışırsanız, derleme anında (compile-time) hata alırsınız.

Bu rezerve method isimlerini inceleyelim;

Özellikler (Properties) için Rezerve Methodlar;

Class veya Struct‘larınıza eklediğiniz özellikler, derleme zamanında

T add_{OzellikAdi}
void set_{OzellikAdi}(T value)

şablonunda iki method’a dönüştürülür. Class veya Struct‘ınıza bu şablona uyan method ekleyemezsiniz.

Indexer’lar için Rezerve Methodlar;

Indexer’larınız derleme zamanında

T get_Item(Parametre)
void set_Item(Parametre, T value)

şablonunda iki method’a dönüştürülür.

Yıkıcılar (Destructors) için Rezerve Methodlar;

Class veya Struct‘ınıza eklediğiniz Destructor kodu derleme zamanında

void Finalize()

method’una dönüştürülür. Class veya Struct‘ınıza Finalize() method’u eklemeye çalıştığınızda derleme zamanında uyarı alırsınız.

Olaylar (Events) için Rezerve Methodlar;

Olaylarınız için derleme zamanında kodunuza

void add_{EventAdi}(T callback)
void remove_{EventAdi}(T callback)

methodları eklenir.

C# ile Kes-Kopyala-Yapıştır Olaylarını Fırlatan Textbox

.Net Framework’ün Textbox‘ı bir çok kullanışlı event‘i kullanımımıza sunmuştur. Böylece programcılar olarak kod yazmak için seçebileceğimiz geniş bir olay kütüphanesi vardır. Mesela TextChanged olayına ayrı, KeyDown olayına ayrı, KeyUp olayına ayrı kod yazabiliriz.

Fakat nedense, textbox’tan metin kopyalarken/keserken veya textbox’a metin yapıştırırken fırlatılan bir olay yoktur. Çeşitli sebeplerle projelerimizde Kes-Kopyala-Yapıştır olaylarını fırlatan bir textbox’a ihtiyaç duyabiliriz.

Textbox kontrolüne özel event’ler eklemek için, yeni bir class oluşturup, Textbox class’ından türemesini sağlamalıyız.

public partial class GelismisTextBox : TextBox
{
}

Windows‘un sunduğu Kes-Kopyala-Yapıştır olaylarını GelismisTextbox class’ımızda yönetebilmek için WndProc() method’unu override etmemiz lazım.

private const int WM_CUT = 0x0300;
private const int WM_COPY = 0x0301;
private const int WM_PASTE = 0x0302;

protected override void WndProc(ref Message m)
{
	switch(m.Msg)
	{
		case WM_CUT:
			/// Kes komutu olayını fırlat
			break;
		case WM_COPY:
			/// Kopyala komutu olayını fırlat
			break;
		case WM_PASTE:
			/// Yapıştır komutu olayını fırlat
			break;
		default:
			base.WndProc(ref m);
			break;
	}
}

Şimdi yapmamız gereken, GelismisTextbox class’ımıza olayları fırlatacak kodu eklemek.

public class ClipboardEventArgs : EventArgs
{
	private string clipboardText;
	public string ClipboardText
	{
		get { return clipboardText; }
		set { clipboardText = value; }
	}

	public ClipboardEventArgs(string clipboardText)
	{
		this.clipboardText = clipboardText;
	}
}
public delegate void ClipboardEventHandler(object sender, ClipboardEventArgs e);

public event ClipboardEventHandler CutText;
public event ClipboardEventHandler CopiedText;
public event ClipboardEventHandler PastedText;

Artık GelismisTextbox kontrolünü projemizde kullanabiliriz. GelismisTextbox kontrolünde yapılacak Kes-Kopyala-Yapıştır işlemleri esnasında fırlatılacak olaylara ilişkin kodlarda yazabiliriz. Örneğin;

private void txtOrnek_CutText(object sender, ClipboardEventArgs e)
{
	MessageBox.Show("Gelişmiş Textbox'tan kesilen : " + e.ClipboardText);
}
private void txtOrnek_CopiedText(object sender, ClipboardEventArgs e)
{
	MessageBox.Show("Gelişmiş Textbox'tan kopyalanan : " + e.ClipboardText);
}
private void txtOrnek_PastedText(object sender, ClipboardEventArgs e)
{
	MessageBox.Show("Gelişmiş Textbox'a yapıştırılan : " + e.ClipboardText);
}

GelismisTexbox class’ının kodu;

public partial class GelismisTextBox : TextBox
{
	private const int WM_CUT = 0x0300;
	private const int WM_COPY = 0x0301;
	private const int WM_PASTE = 0x0302;

	public delegate void ClipboardEventHandler(object sender, ClipboardEventArgs e);

	public event ClipboardEventHandler CutText;
	public event ClipboardEventHandler CopiedText;
	public event ClipboardEventHandler PastedText;

	protected override void WndProc(ref Message m)
	{
		switch(m.Msg)
		{
			case WM_CUT:
				if (CutText != null)
					CutText(this, new ClipboardEventArgs(this.SelectedText));
				break;
			case WM_COPY:
				if (CopiedText != null)
					CopiedText(this, new ClipboardEventArgs(this.SelectedText));
				break;
			case WM_PASTE:
				if (PastedText != null)
					PastedText(this, new ClipboardEventArgs(Clipboard.GetText()));
				break;
			default:
				base.WndProc(ref m);
				break;
		}
	}
}

public class ClipboardEventArgs : EventArgs
{
	private string clipboardText;
	public string ClipboardText
	{
		get { return clipboardText; }
		set { clipboardText = value; }
	}

	public ClipboardEventArgs(string clipboardText)
	{
		this.clipboardText = clipboardText;
	}
}