Programlama dillerinin seviyesi arttıkça alt seviyeli işleri yapmak daha zorlaşıyor diye başlayıp yazacaktım ama baktım ki gevezelik olacak direkt konuya geçelim.

Efendim nokta net içinde 'Control' diye bir sınıf, bu sınıf içnde de aşağıdaki gibi bir metod vardır:

 
[C#]
public virtual bool PreProcessMessage(
   ref Message msg
);



Bu metod 'virtual' olduğu için 'control' sınıfından türettiğimiz kendi sınıflarımızda 'override' edebiliriz. Peki bu metod ne işe yarar? Bu metod, eğer türettiğimiz sınıf bir 'Windows Forms' uygulaması içinde çalışıyorsa veya 'ActiveX' kontrol olarak bulunuyorsa çağrılan bir metoddur. Ve çağrıldığı zaman bize windows'tan mesaj getirir. Küçük bir örnek verelim, bir forms uygulamasını açtık ve bir metun kutusu içinde klavyeden 'A' tuşuna bastık, peki metin kutusunun nasıl haberi olacak? İşte windows metin kutusunun 'PreProcessMessage' metodunu çağırır ve ona, bak sana bir mesajım var der...

Bu metodu kullanarak şöyle bir özel bir metin kutusu yazdım, önce kodu görelim(sadeleşmiş halini) sonra açıklayalım:

 

public class KarTextBox : System.Windows.Forms.TextBox
{
   Hashtable _shiftKeyMap = new Hashtable();

   public Hashtable ShiftKeyMap {
      get{ return _shiftKeyMap; }
   }

   public override bool PreProcessMessage(ref Message msg)
   {
      Keys keyCode = ( ( Keys ) ( int ) msg.WParam ); // (1)

                     //(2) (3)
      if(ShiftKeyMap.ContainsKey(keyCode) && ((Control.ModifierKeys & Keys.Shift) != 0))
      {
         msg.WParam = new IntPtr((int)ShiftKeyMap[keyCode]);
         return true;
      }
      return false;
   }
}



Bu metin kutusunu yazmaktaki amacımız klavyeden basılan karakterleri istediğimiz başka karakterler ile değiştirmek, niye diye sormayın :)

Metin kutumuz standart windows metin kutusundan türetildi, böylece onun tüm özelliklerine sahip olacak. Ek olarak 'ShiftKeyMap' diye bir özellik ekledik ki bunun tipi hashtable, kullanımı ise şöyle karTextBox1.ShiftKeyMap.Add(Keys.A, Keys.B); yani klavyeden shift+a tuşuna basılırsa biz bunu 'B' tuşuna çevireceğiz.

Şimdi malum metodun açıklamasını yapalım, önce msg değişkeni içindeki tuş kodu alınıyor (1). Daha sonra bu tuş hashtable içinde bulunuyor mu diye bakılıyor (2). Ve de shift tuşuna baılmış mı? diye kontrol ediliyor (3). Shift tuşunu kontrol etmek için Control sınıfındaki statik bir alandan faydalanmak gerekli 'ModifierKeys', ki bu alan içinde sadece shift değil bazı diğer özel tuşların durumlarınıda bulmak mümkün. Tekrar konumuza dönersek (2) ve (3) nolu kontroller doğru ise direkt mesajın içeriğini değiştiriyoruz(4).

Son bir önemli not mesajları incelemek için 'msg.ToString()' in sonucuna bakarsanız güzel bilgiler edinirsiniz ;)