Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengesan Perubahan Warna Piksel Skrin dan Peristiwa Pencetus?

Bagaimanakah Saya Boleh Mengesan Perubahan Warna Piksel Skrin dan Peristiwa Pencetus?

Linda Hamilton
Linda Hamiltonasal
2024-12-31 03:38:10521semak imbas

How Can I Detect Screen Pixel Color Changes and Trigger Events?

Membaca Warna Piksel Skrin untuk Pencetusan Acara

Pernyataan Masalah:

Menentukan kaedah untuk menangkap warna sesuatu piksel skrin dan mencetuskan peristiwa berdasarkan yang dikesan warna.

Penyelesaian:

Teknik paling cekap melibatkan penangkapan piksel di lokasi kursor, memastikan keserasian merentas berbilang monitor.

Pelaksanaan Terperinci:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace ScreenPixelReader
{
    public partial class Form1 : Form
    {
        [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);

        public Form1()
        {
            InitializeComponent();
        }

        private void MouseMoveTimer_Tick(object sender, EventArgs e)
        {
            Point cursor = new Point();
            GetCursorPos(ref cursor);

            var c = GetColorAt(cursor);
            this.BackColor = c;

            if (c.R == c.G && c.G < 64 && c.B > 128)
            {
                MessageBox.Show("Blue");
            }
        }

        Bitmap screenPixel = new Bitmap(1, 1, PixelFormat.Format32bppArgb);
        public Color GetColorAt(Point location)
        {
            // Create off-screen bitmaps for capturing screen pixels
            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 the captured pixel color
            return screenPixel.GetPixel(0, 0);
        }
    }
}

Tinjauan untuk Perubahan Warna Piksel:

Untuk terus memantau warna piksel tertentu, anda boleh menggunakan fungsi berikut dalam gelung atau benang:

private void PollPixel(Point location, Color color)
{
    while (true)
    {
        var c = GetColorAt(location);

        if (c.R == color.R && c.G == color.G && c.B == color.B)
        {
            DoAction();
            return;
        }

        Thread.Sleep();
    }
}

Kesimpulan:

Pendekatan ini membolehkan pengesanan warna piksel skrin yang tepat dan membolehkan pencetus peristiwa yang boleh dipercayai berdasarkan warna.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengesan Perubahan Warna Piksel Skrin dan Peristiwa Pencetus?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn