Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

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...

5 Cevaplar

  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

  2. Gürkan dedi ki:

    Merhaba projeyi mail atabilirmisiniz ?
    grknuzn@gmail.com

    • Gençay dedi ki:

      Merhaba,

      İşin nasıl yapıldığına dair gerekli açıklamalar makalede yeterince açık bir şekilde izah edilmiştir. Ne yazık ki elimde hazır bir proje bulunmamaktadır.
      Sevgiler.

  3. serkan dedi ki:

    merhaba,
    bu şekilde istediğimiz koordinattaki rengi aldık pekala. peki aynı koordinattaki pixel rengi değişirse uyarı mesajı nasıl verebiliriz ?

    örneğin ilk başta bir koordinattaki rengi aldık ve o renk siyah olsun. ardından başka bir program vs açtık o koordinattaki renk beyaz oldu diyelim.

    o koordinatın renk değiştirdiğini nasıl anlarız ?

    • ahmet yagız dedi ki:

      Kordinattani rengi nasıl alacağız lütfen yardımcı ol 😀 kaç haftadır ayrıyorum.

Bir cevap yazın

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