測試過對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中,再放到全屏用鼠標取上面的點。
缺點就不是動態實時的取點了。