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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章