Makale Özeti

Uygulamalarımız arka planda çalışırken bile klavye ve mouse ların eventlarını yakalamak isteyebiliriz. Bunun için windows un kendi çözümlerini kullanarak bu event yakalama olayını inceleyeceğiz.

Makale

Merhabalar...
Bilindiği gibi uygulamalarımızda kullanıcılarımıza en etkin şekilde uygulamayı 
kullanabilmesi için bazı özel tuş ve klavye kullanımlarını kontrol ederek en hızlı
şekilde kişinin amacına en kısa yoldan gitmesini isteriz. Bunun için en basitinden yaptığımız
tab kontrollerdir veya enter dinletisileridir. bazen bunlar uygulamalarımızın daha rahat ve 
pratik kullanımı için yeterli olmayabilir. bilindiği gibi bu olayları yapabilmemiz için uygulamalarımızın
açık ve aktif olması gerekiyor. ama biz bu sınırları aşaak sürekli kalavye ve mouse tan gelen bilgileri
sürekli programımız arka plana çalışıyor olsa bile dinlemek isteyebiliriz. bu işi yapan bir çok program var.
bunun için en etin örnek sanırım çoğumuzun bildiği byblon sözlüğü. bildiğiniz gibi byblon arka planda 
sürekli çalışır ve kendimizin programa tanıttığımız özel tuşarı sürekli dinler. ve bu tuşlara kullanıcı herhangi bir 
tepki verir ise byblon aktif olur. 


örneğimizde windowsun kendi yayımladığı bir sınıfı kullanacağız. bu sınıf bize tüm klavye ve mouse a gelen tepkileri
bildiriyor. ilgili sınıfın detaylı bilgisine şu adresten ulaşabilirsiniz. 
http://support.microsoft.com/default.aspx?scid=kb;en-us;318804

bunun için gereken sınıfı ben programın demosunun içine koydum. oradan kullanabilirsiniz.

şimdi örneğimizi yapmaya başlayalım. bir windows projesi oluşturalım ve resimdeki gibi kontrollerimizi
şekildeki gibi yerleştirelim.





şeklimizdeki kontrollerin evetları ve name leri şu şekilde:
başlat butonu: name=buttonBaslat, onclick eventı=ButtonBaslaClick
durdur butonu: name=buttonDur, onclick eventı=ButtonDurClick
temizle butonu: name btn_Temizle, onclick eventı=btn_Temizle_Click
mouse poisyonu label'ı: name=labelMousePosition
textbox multiline olacak : name=textBox

kontrollerimiz bu şekilde.

aşağıda uygulamanın kodlarını verdim. sadece form dizayn kodlarını çıkardım. 
onları siz kendiniz eklersiniz zaten.

projemize microsoft un verdiği hook sınıfını ekliyoruz ve using ile tanıtıyoruz.


---


using System;
using System.Windows.Forms;
using gma.System.Windows;

namespace GlobalHookDemo 
{
    class MainForm : System.Windows.Forms.Form
    {
        
			//buraya dizayn için gelecek olan kodlar

	   		void ButtonBaslaClick(object sender, System.EventArgs e)
        {
            actHook.Start();//dinleyiciyi aktif hale getiriyoruz.
        }
        
        void ButtonDurClick(object sender, System.EventArgs e)
        {
            actHook.Stop();//dinleyiciyi pasif hale getiriyoruz.
        }
        
        
        UserActivityHook actHook;
        void MainFormLoad(object sender, System.EventArgs e)
        {
            actHook = new UserActivityHook(); 
            // evetları yakalıyoruz v ilgili fonksiyonlar tanıtıyoruz..
            actHook.OnMouseActivity+=new MouseEventHandler(MouseMoved);//mouse hareketlerii yakalama
            actHook.KeyDown+=new KeyEventHandler(MyKeyDown);//klavyeye basılma esnasındaki yakalama
            actHook.KeyPress+=new KeyPressEventHandler(MyKeyPress);//klavyeyi basılı haldeki yakalama
            actHook.KeyUp+=new KeyEventHandler(MyKeyUp);//klavyeye basmayı kaldırırken ki yakalamalar
        }
        
        // mouse hareket halinde iken alınacak olan pozisyonlar
        // X=X kordinatı  | Y=Y kordinatı  | Delta=tekerlek yönü 120 yukarı,-120 aşağı,0 hareketsiz
        public void MouseMoved(object sender, MouseEventArgs e)
        {
            labelMousePosition.Text=String.Format("x={0}  y={1} tekerlek={2}", e.X, e.Y, e.Delta);
            if (e.Clicks>0) LogWrite("MouseButon     - " + e.Button.ToString());
        }
        
        //klavyeye basılma esnasındaki ilk hamlede alınan tuş bilgisi
        public void MyKeyDown(object sender, KeyEventArgs e)
        {
            LogWrite("TuşaBasıldı     - " + e.KeyData.ToString());
        }
        
        //klavyede basılı tutulan tuş bilgisi
        public void MyKeyPress(object sender, KeyPressEventArgs e)
        {
            LogWrite("TuşaBasılı     - " + e.KeyChar);
        }
        
        //klavyedeki basıl halden kaldırılan tuş bilgisi
        public void MyKeyUp(object sender, KeyEventArgs e)
        {
            LogWrite("TuştanKaldırıldı         - " + e.KeyData.ToString());
        }
        
        //yakalanan tuş ve mouse bilgisini yazdıralım
        private void LogWrite(string txt)
        {
            textBox.AppendText(txt + Environment.NewLine);
            textBox.SelectionStart = textBox.Text.Length;
        }

        private void btn_Temizle_Click(object sender, EventArgs e)
        {
            textBox.Clear();
        }

    }            
}

bu şekilde kodlamalarımızı yaptıktan sonra uygulamamızı çalıştırdığımızda aşağıdaki
gibi bir görüntü ortaya çıkacak...



bakın printscreen tuşu bile çıkmış :D


umarım işinize yarayacak bir makale olmuştur. 
Kendinize İyi Bakın! Görüşmek Üzere...
Uygulamanın Örnek Projesi