测试过对Win7 64位 32位 WinXP都可用的:
http://www.cnblogs.com/hihell/archive/2011/09/16/2178660.html
网上能找到的几种方法:
方法一:
http://www.cnblogs.com/isaced/archive/2011/01/25/1944630.html
有如下问题:
XP和Win7 32位下完美支持,但Win7 64位下无效,取到的永远是#FFFFFF白色。
关键代码:
[DllImport("user32.dll")]//取设备场景
private static extern IntPtr GetDC(IntPtr hwnd);//返回设备场景句柄
[DllImport("gdi32.dll")]//取指定点颜色
private static extern int GetPixel(IntPtr hdc, Point p);
private void timer1_Tick(object sender, EventArgs e)
{
Point p = new Point(MousePosition.X, MousePosition.Y);//取置顶点坐标
textBox_p.Text = p.X + "," + p.Y;//把坐标显示到窗口上
IntPtr hdc = GetDC(new IntPtr(0));//取到设备场景(0就是全屏的设备场景)
int c = GetPixel(hdc, p);//取指定点颜色
int r = (c & 0xFF);//转换R
int g = (c & 0xFF00) / 256;//转换G
int b = (c & 0xFF0000) / 65536;//转换B
textBox_10jz.Text = c.ToString();//输出10进制颜色
textBox_16jz.Text = r.ToString("x").PadLeft(2, '0') + g.ToString("x").PadLeft(2, '0') + b.ToString("x").PadLeft(2, '0');//输出16进制颜色
textBox_RGB.Text = r.ToString() + ',' + g.ToString() + ',' + b.ToString();//输出RGB
pictureBox_color.BackColor = Color.FromArgb(r,g,b);//设置颜色框
}
说明:
用系统API:GetDC和GetPixel,直接取DC上的颜色值,速度快,内存占用小,问题就是Win7 64位不支持。
方法二:
http://www.cnblogs.com/scy251147/archive/2010/08/12/1798331.html
针对上面的代码多加一点
有如下问题:
XP下一切正常,但在Win7 32位和64位下,状态栏上的开始按钮取到的全部是#FFFFFF,状态栏条上的永远是#000000
关键代码:
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
Point Papi = new Point();
GetCursorPos(out Papi);
IntPtr v_hwnd = WindowFromPoint(Papi);
IntPtr v_DC = GetDC(v_hwnd);
ScreenToClient(v_hwnd, ref Papi);
int v_Color = GetPixel(v_DC, Papi);
int v_Red, v_Green, v_Blue;
v_Red = v_Color & 0xff;
v_Green = (v_Color & 0xff00) / 256;
v_Blue = (v_Color & 0xff0000) / 65536;
this.txtRGB.Text ="#"+v_Red.ToString("x").PadLeft(2, '0') + v_Green.ToString("x").PadLeft(2, '0') + v_Blue.ToString("x").PadLeft(2, '0');
this.txtRGBDesc.Text = v_Red.ToString("d") + " " + v_Green.ToString("d") + " " + v_Blue.ToString("d");
this.txtShow.BackColor = Color.FromArgb((int)v_Red, (int)v_Green, (int)v_Blue);
ReleaseDC(v_hwnd, v_DC);
}
说明:
用系统API:GetCursorPos取鼠标绝对位置,WindowFromPoint取鼠标位置所在句柄,GetDC通过句柄取DC,ScreenToClient转换坐标从鼠标绝对位置转为对应句柄内的相对位置,GetPixel根据DC和相对鼠标位置取颜色。
方法三:
对整个屏幕抓屏后放到PictureBox中,再放到全屏用鼠标取上面的点。
缺点就不是动态实时的取点了。