C# klavye ile mouse kontrolü

talhakoc 17 Mayıs 2015C Programlama

Bu makalede C# ile mouse sağ, sol, yukarı, aşağı ve sol tık işlemleri ile beraber windows form application arka planda çalışırken mouse kontrolü anlatılacaktır. Bu uygulama ile kullanıcılar mouse kullanmadan klavye ile sağ, sol, yukarı, aşağı hareketler yapabilecek ve bunu yaparken formdan bağımsız çalışacaktır. Bu kodlar ile bu mouse hareketleri istenilen klavye tuşları ile kontrol edilebilecektir. Kodlarda sağ, sol, yukarı ve aşağı mouse hareketleri yön tuşları ile; tıklama ise sıfır ile sağlanmaktadır.  Kodun çalışması için bir windows form uygulaması açılır ve aşağıdaki gibi değiştirilir.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Utilities;

namespace WindowsFormsApplication11
{
public partial class Form1 : Form
{

[DllImport(“user32.dll”)]
static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);

[Flags]
public enum MouseEventFlags
{
LEFTDOWN = 0x00000002,
LEFTUP = 0x00000004,
MIDDLEDOWN = 0x00000020,
MIDDLEUP = 0x00000040,
MOVE = 0x00000001,
ABSOLUTE = 0x00008000,
RIGHTDOWN = 0x00000008,
RIGHTUP = 0x00000010
}

globalKeyboardHook sol = new globalKeyboardHook();
globalKeyboardHook sag = new globalKeyboardHook();
globalKeyboardHook yuk = new globalKeyboardHook();
globalKeyboardHook asagi = new globalKeyboardHook();
globalKeyboardHook tik = new globalKeyboardHook();
public Form1()
{
InitializeComponent();
klavyetus();
}
public void klavyetus()
{
sol.HookedKeys.Add(Keys.Left);
sag.HookedKeys.Add(Keys.Right);
yuk.HookedKeys.Add(Keys.Up);
asagi.HookedKeys.Add(Keys.Down);
tik.HookedKeys.Add(Keys.NumPad0);

sol.KeyDown += new KeyEventHandler(solyap);
sag.KeyDown += new KeyEventHandler(sagyap);
yuk.KeyDown += new KeyEventHandler(yukyap);
asagi.KeyDown += new KeyEventHandler(asagiyap);
tik.KeyDown += new KeyEventHandler(tikyap);
tik.KeyUp += new KeyEventHandler(tikyap1);
}
void solyap(object sender, KeyEventArgs e)
{
Cursor.Position = new Point(Cursor.Position.X – 15, Cursor.Position.Y);
e.Handled = false;
}
void sagyap(object sender, KeyEventArgs e)
{
Cursor.Position = new Point(Cursor.Position.X + 15, Cursor.Position.Y);
e.Handled = false;
}
void yukyap(object sender, KeyEventArgs e)
{
Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y – 15);
e.Handled = false;
}
void asagiyap(object sender, KeyEventArgs e)
{
Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y + 15);
e.Handled = false;
}
void tikyap(object sender, KeyEventArgs e)
{
int xx = System.Windows.Forms.Cursor.Position.X;
int yy = System.Windows.Forms.Cursor.Position.Y;
Cursor.Position = new System.Drawing.Point(xx, yy);
mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);
e.Handled = false;
}
void tikyap1(object sender, KeyEventArgs e)
{
int xx = System.Windows.Forms.Cursor.Position.X;
int yy = System.Windows.Forms.Cursor.Position.Y;
Cursor.Position = new System.Drawing.Point(xx, yy);
mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0);
e.Handled = false;
}}}

mouse a kontrolü user32.dll dosyası ile sağlanmaktadır. Onun için bilgisayarda bulunan bu dosya oluşturulan c# projesine eklenmelidir. dll ekleme işlemlerinin bulunduğu kütüphane “using System.Runtime.InteropServices;” kısmındaki kütüphanedir.

Klavyenin formdan bağımsız olarak form arka planda çalışırken klavyeden herhangi bir tuş okuyabilmesi için geliştirilmiş bir klas bulunmaktadır. Bu global keyboard hook klasına http://www.codeproject.com/Articles/19004/A-Simple-C-Global-Low-Level-Keyboard-Hook adresinden ulaşılabilir. İndirilen zip dosyasındaki “globalKeyboardHook.cs” isimli dosya proje dizinine kopyalanarak proje>add>existing item yolunu izleyerek projeye eklenmelidir. Kütüphane kısmında da bu klasın tutulduğu “using Utilities” kodu eklenmelidir.

Mouse sol tık olayı için user32.dll dosyasını yüklemek gerekmektedir.

[DllImport(“user32.dll”)]

Bu kod projeye user32.dll dosyasını eklemektedir.

static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);

Bu kod ile click işlemi yapacak olan fonksiyon tanımlanmaktadır.

[Flags]
public enum MouseEventFlags
{
LEFTDOWN = 0x00000002,
LEFTUP = 0x00000004,
MIDDLEDOWN = 0x00000020,
MIDDLEUP = 0x00000040,
MOVE = 0x00000001,
ABSOLUTE = 0x00008000,
RIGHTDOWN = 0x00000008,
RIGHTUP = 0x00000010
}

Bu kodlar ile mouse_event fonksiyonunda kullanılacak bayraklar tanımlanmaktadır.

globalKeyboardHook sol = new globalKeyboardHook();
globalKeyboardHook sag = new globalKeyboardHook();
globalKeyboardHook yuk = new globalKeyboardHook();
globalKeyboardHook asagi = new globalKeyboardHook();
globalKeyboardHook tik = new globalKeyboardHook();

Bu kodlar ile klavyeden girilmesi beklenen tuşlar sonradan eklediğimiz sınıftan yani globalKeyboardHook sınıfından değişkenler oluşturulur. Bu sınıf klavyeden basılacak olan tuşun form arka planda dahi olsa girilip girilmediğini kontrol etmek için kullanılır. klavyetus isimli bir fonksiyon oluşturularak formun içinde tanımlanır.

public void klavyetus()
{
sol.HookedKeys.Add(Keys.Left);
sag.HookedKeys.Add(Keys.Right);
yuk.HookedKeys.Add(Keys.Up);
asagi.HookedKeys.Add(Keys.Down);
tik.HookedKeys.Add(Keys.NumPad0);

sol.KeyDown += new KeyEventHandler(solyap);
sag.KeyDown += new KeyEventHandler(sagyap);
yuk.KeyDown += new KeyEventHandler(yukyap);
asagi.KeyDown += new KeyEventHandler(asagiyap);
tik.KeyDown += new KeyEventHandler(tikyap);
tik.KeyUp += new KeyEventHandler(tikyap1);
}

Bu fonksiyonda globalKeyboardHook sınıfından tanımlanan değişkenlere tuş atanarak bu tuşlara basıldığı taktirde parantez içindeki fonksiyonların tetiklenmesi işlemi gerçekleştirilir. “sol.HookedKeys.Add(Keys.Left);” komutunda sol ismi ile tanımlanan değişkene sol yön tuşu’nu atamaktadır. “sol.KeyDown += new KeyEventHandler(solyap);” komutunda ise sol değişkenine tanımlanan sol yön tuşuna basıldığında solyap isimli fonksiyon tetiklenir. Daha sonraki void olarak tanımlı dört fonksiyon (solyap,  sagyap, yukyap, asagiyap) mouse imlecinin bulunduğu konumu yeniden tanımlamak için kullanılmaktadır. Örneğin solyap fonksiyonu devreye girdiğinde “Cursor.Position = new Point(Cursor.Position.X – 15, Cursor.Position.Y);” komutu devreye girecektir. Cursor.Position mouse konumunu göstermektedir ve ve yeniden eşittirin sağında bir nokta belirlenerek mouse imlecinin konumu değiştirilecektir.

tikyap fonksiyonunda ise önce mouse imlecinin bulunduğu nokta’nın “x” ve “y” koordinatları değişken değerlerine atanmaktadır. Mouse fonksiyonlarında sol tıklama işleminde bile mousun konumu yeniden ayarlanmalıdır. “Cursor.Position = new Point(Cursor.Position.X, Cursor.Position.Y);” fonksiyonu ile mouse imlecinin konumu yine kendisine eşitlenmiştir. Bu komutu yazmazsanız hata verecektir.  “mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);” komutunda ise mouse imlecinin bulunduğu yer tıklanıcaktır. tikyap1 fonksiyonu çalıştığında da tıklanmış olan mouse hareketi sonlanacaktır.

Bu yazıda yön tuşları ile mouse kontrol gerçekleştirilmiştir. Mouse yön tuşları haricinde başka bir şekilde de kontrol edebilir. Ya da klavye global okunma kullanılarak klavye ile bilgisayara hükmetmek mümkündür.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Arama

Twitterda

© 2014 - Talha Koç. All Rights Reserved. Powered by Wordpress and Design by We Create Web Designs