Merhaba,
Win32 kütüphaneleri ile yapısal olarak her ne kadar işletim sisteminin nimetlerini kullanarak programın haricine müdahale edebiliyor olsakta, aslında renksel bazı çalışmalarda algoritmik olarak ekranın hangi lokasyonunda olduğumuzu bulmamızı sağlayan yahut renk yoğunluğuna göre belirli işlemlerin yapılmasına imkan verecek olan mouse ile gelinen pixeldeki değeri okumayı inceliyor olacağız.
Mouse’un bulunduğu lokasyondaki pixele erişip oradaki rengi algılamak için “user32.dll” ve “gdi32.dll” Win32 kütüphanelerini kullanacağız.
Hiç vakit kaybetmeden kodumuzu inşa edelim…
Yapacağımız çalışma aşağıdaki gibi olacaktır;
[DllImport("user32.dll")]
static extern bool GetCursorPos(ref Point lpPoint);
[DllImport("gdi32.dll", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]
public static extern int BitBlt(IntPtr hDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop);
Bitmap screenPixel = new Bitmap(1, 1, PixelFormat.Format32bppArgb);
public Color GetColorAt(Point location)
{
using (Graphics gdest = Graphics.FromImage(screenPixel))
{
using (Graphics gsrc = Graphics.FromHwnd(IntPtr.Zero))
{
IntPtr hSrcDC = gsrc.GetHdc();
IntPtr hDC = gdest.GetHdc();
int retval = BitBlt(hDC, 0, 0, 1, 1, hSrcDC, location.X, location.Y, (int)CopyPixelOperation.SourceCopy);
gdest.ReleaseHdc();
gsrc.ReleaseHdc();
}
}
return screenPixel.GetPixel(0, 0);
}
Yukarıdaki kod bloğunu incelerseniz eğer “user32.dll” kütüphanesinden extern ettiğimiz “GetCursorPos” metodu mouseun koordinatlarını bizlere ulaştırmaktayken, “gdi32.dll” kütüphanesinden extern edilen “BitBlt” metodu ise mouseun o anki bulunduğu pixelle ilgili gerekli bilgileri edindirmektedir. “GetColorAt” metodu ise o anki piksele harici metotlarımız aracılığıyla erişip istenilen renk kodlarını elde etmekte ve Color tipinden geriye return etmektedir.
İşte bu işlemlerden sonra aşağıdaki gibi sonsuz bir döngüyle tetiklenen asenkron temelli yaklaşım sayesinde videodan da göreceğiniz gibi ekrandaki mouse ile gezilen noktalardaki pixel değerlerini elde edebilirsiniz.
private async void Form1_Load(object sender, EventArgs e)
{
await Task.Run(() =>
{
while (true)
{
Point cursor = new Point();
GetCursorPos(ref cursor);
var c = GetColorAt(cursor);
this.BackColor = c;
}
});
}
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
