WPF 取色笔的实现

笔主想在触摸屏上实现一个类 似于Snipaste的取色器功能,于是做了以下尝试,以下代码为一个取色器小窗口:

首先创建一个WPF窗口,样式这里就不放上来了,按自己爱好设计,这里设计理念就是获得窗口中间的像素点颜色,实际样式可以设计一个十字指向中间等。

[DllImport("user32.dll")]
static extern IntPtr GetDC(IntPtr hwnd);

[DllImport("user32.dll")]
static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc);

[DllImport("gdi32.dll")]
static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos);

public string CaptureColor { set; get; }

public Action<string> CallBackAction;

/// <summary>
/// 获取屏幕像素点的色彩数值
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
static public System.Drawing.Color GetPixelColor(int x, int y)
{
    IntPtr hdc = GetDC(IntPtr.Zero);
    uint pixel = GetPixel(hdc, x, y);
    ReleaseDC(IntPtr.Zero, hdc);
    var color = System.Drawing.Color.FromArgb((int)(pixel & 0x000000FF),
                 (int)(pixel & 0x0000FF00) >> 8,
                 (int)(pixel & 0x00FF0000) >> 16);
    return color;
}

private void Window_LocationChanged(object sender, EventArgs e)
{
    //获取十字中心点的颜色的数据
    var pixelColor = GetPixelColor((int)(this.Left + 十字中心X坐标), (int)(this.Top + 十字中心Y坐标));
    //转换成RGBA格式,符合平常看到的#颜色格式
    System.Windows.Media.Color mediaColor = System.Windows.Media.Color.FromArgb
        (pixelColor.A, pixelColor.R, pixelColor.G, pixelColor.B);
    CaptureColor = mediaColor.ToString()[3..];
    //将颜色回调出去,在外面处理业务
    CallBackAction.Invoke(CaptureColor);
}
posted @ 2026-08-10 10:56  Poetindusk  阅读(2)  评论(0)    收藏  举报