Win32 – C# ile Ekrandaki Mouse ile Gelinen Pixel’in Rengini Okuma

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…

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. Ceyhun dedi ki:

    Sa hocam bende tam buna yakin bir sey ariyordum
    Su kordinata git renk bu ise su islemi yap degil ise bu islemi yap nasil yazilir c# da
    Cyhnzy@gmail.com
    Whatsapp 553 86*****
    Ceyhun

Bir cevap yazın

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

*

Copy Protected by Chetan's WP-Copyprotect.