using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Runtime.InteropServices;//导入命名空间
namespace GetColorDLL
{
public sealed class GetMouseColor
{
#region 外部函数
/*
*
* 函数功能:该函数检索指定坐标点的像素的RGB颜色值。
*
* 参数说明:hdc:设备环境句柄。
*
* XPos:指定要检查的像素点的逻辑X轴坐标。
*
* YPos:指定要检查的像素点的逻辑Y轴坐标。
*
* 返回值:返回值是该象像点的RGB值。
*/
[DllImport("gdi32.dll")]
private static extern uint GetPixel(IntPtr hwnd, int xPos, int yPos);
/*
* 函数功能:该函数删除指定的设备上下文环境(Dc)。
*
* 参数:hdc:设备上下文环境的句柄。
*
* 返回值:成功,返回非零值;失败,返回零。
*/
[DllImport("gdi32.dll")]
private static extern bool DeleteDC(IntPtr DC);
/*
* 函数功能:该函数通过使用指定的名字为一个设备创建设备上下文环境。
*
* 参数说明:drivername 1、用DISPLAY,是获取整个屏幕的设备场景;2、用WINSPOOL,则是访问打印驱动
*
* deviceName 所用专门设备的名称。该名由打印管理器分配显示
*
* output 用null值给该参数
*
* lpinitData DEVMODE,该结构保存初始值
*
*/
[DllImport("gdi32.dll")]
private static extern IntPtr CreateDC(string driverName, string deviceName, string output, IntPtr lpinitDate);
#endregion
#region 获取相应的像素值方法
/// <summary>
/// 获取红色的像素值
/// </summary>
/// <param name="color"></param>
/// <returns></returns>
private static byte GetR(uint color)
{
return (byte)color;
}
/// <summary>
/// 获取绿色的像素值
/// </summary>
/// <param name="color"></param>
/// <returns></returns>
private static byte GetG(uint color)
{
return (byte)(((short)color) >> 8);
}
/// <summary>
/// 获取蓝色的像素值
/// </summary>
/// <param name="color"></param>
/// <returns></returns>
private static byte GetB(uint color)
{
return (byte)((color) >> 16);
}
/// <summary>
/// 检索指定坐标点的像素的RGB颜色值,转换成Color
/// </summary>
/// <param name="p">鼠标位置</param>
/// <returns></returns>
public static Color GetColor(Point p)
{
//创建设备场景
IntPtr hwnd = CreateDC("DISPLAY", null, null, IntPtr.Zero);
//获取像素值
uint color = GetPixel(hwnd, p.X, p.Y);
//删除设备场景
DeleteDC(hwnd);
byte r = GetR(color);
byte g = GetG(color);
byte b = GetB(color);
return Color.FromArgb(r, g, b);
}
#endregion
}
}