donjuanhose81
06.Kasım.2014, 13:22
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
}
}
Ö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
}
}