C#屏幕取色(支持Win7 64位 32位 WinXP)

测试过对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:GetDCGetPixel,直接取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通过句柄取DCScreenToClient转换坐标从鼠标绝对位置转为对应句柄内的相对位置,GetPixel根据DC和相对鼠标位置取颜色。

方法三:
对整个屏幕抓屏后放到PictureBox中,再放到全屏用鼠标取上面的点。
缺点就不是动态实时的取点了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值