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);
}

浙公网安备 33010602011771号