Bu derste tuş okumanızda olağan üstü kolaylık sağlıyacak bir kodu sizlerle paylaşacağım.

Öncelikle projemizde yeni bir sınıf oluşturalım ve şu kodları ekelyelim:

Kod:

using System;
using System.Runtime.InteropServices;
using System.Threading;

namespace projeadi
{

public static class ReadKey
{

//gruplamalar
#region events

public static delegate void _GetKey(Keys key,int ascii,bool down);
public static event _GetKey GetKey;

#endregion

#region api

[DllImport("user32.dll")]
public static extern int GetAsyncKeyState(long vKey);

#endregion

#region variables

//bu değişken tuşların ascii değerlerini tutucak
public static bool[] keys = new down[255];

//bu da arka planda okunacak tuşları bulacak olan thread
internal static Thread _readmethods;

//iki kere yüklemeyi önlemek için
internal static bool load=false;

#endregion

#region methods

public static bool Load()
{

//eğer daha önceden yüklenmiş ise false dönücek
if(load)
return false;

load=true;
_readmethods = new Thread(readkeys);
_readmethods.Start();

return true;
}

internal static bool down(int ascii)
{
return (GetAsyncKeyState(ascii) == -32767 || GetAsyncKeyState(ascii) == -32768);
}

internal static void readkeys()
{

//sürekli okumalı
while(true)
{

//tuşlar 1 den başlar 255 de biter
for(int i = 1;i <= 255;i++)
{

#region down

//eğer tuşa basılıysa
if(down(i))
{

//eğer daha önceden basılmadıysa
if(!keys[i])
{

keys[i]=true;

//eğer event atanmışsa
if(GetKey!=null)
GetKey((Keys)i,i,keys[i]);

}

}

#endregion
#region up

//değilse
else
{

//daha önceden basıldıysa
if(keys[i])
{

keys[i]=false;

//eğer event atanmışsa
if(GetKey!=null)
GetKey((Keys)i,i,keys[i]);

}

}

#endregion

}

Thread.Sleep(1);//1 salise beklemeli fakat şunu belirtmem lazım
//burdaki komut 1 salise değil daha uzun bir süre beklememize neden oluyo
//ben kendim datetime kontrol yazarak 1 salise yi yıkalıyorum ama on bu dersimizde değil başka bir dersimizde anlatacağım

}

}
#endregion

}

}