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…
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
Merhaba projeyi mail atabilirmisiniz ?
grknuzn@gmail.com
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.
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 ?
Kordinattani rengi nasıl alacağız lütfen yardımcı ol 😀 kaç haftadır ayrıyorum.