C# 从窗口读取特定像素颜色

C# 从窗口读取特定像素颜色,c#,winforms,C#,Winforms,我目前正在从进程窗口读取特定像素颜色,如下所示: [DllImport("gdi32.dll")] private static extern int BitBlt(IntPtr srchDc, int srcX, int srcY, int srcW, int srcH, IntPtr desthDc, int destX, int destY, int op); public static Color GetPixel(IntPtr hw

我目前正在从进程窗口读取特定像素颜色,如下所示:

[DllImport("gdi32.dll")]
private static extern int BitBlt(IntPtr srchDc, int srcX, int srcY, int srcW, 
                         int srcH, IntPtr desthDc, int destX, int destY, int op);

public static Color GetPixel(IntPtr hwnd, int x, int y)
{
    var screenPixel = new Bitmap(1, 1);

    using (Graphics gdest = Graphics.FromImage(screenPixel))
    {
        using (Graphics gsrc = Graphics.FromHwnd(
                                            MemoryHandler.GetMainWindowHandle()))
        {
            IntPtr hsrcdc = gsrc.GetHdc();
            IntPtr hdc = gdest.GetHdc();
            BitBlt(hdc, 0, 0, 1, 1, hsrcdc, x, y, 
                                             (int)CopyPixelOperation.SourceCopy);
            gdest.ReleaseHdc();
            gsrc.ReleaseHdc();
        }
    }

    return screenPixel.GetPixel(0, 0);
}

[DllImport(“gdi32.dll”)]
静态外部COLORREF GetPixel(IntPtr hdc、intnxpos、intnypos);
[StructLayout(LayoutKind.Sequential)]
公共结构COLORREF
{
公共单位颜色词;
公共COLORREF(System.Drawing.Color)
{
ColorDWORD=(uint)color.R+((uint)color.G)8,(int)(0x00FF0000U和ColorDWORD)>>16);
}
公共无效设置颜色(System.Drawing.Color)
{

ColorDWORD=(uint)color.R+((uint)color.G)您没有处理
screenPixel
,尽管我怀疑这是问题所在,除非您多次调用它。@Rotem感谢您的输入。我想我还是这样做吧。Graphics.CopyFromScreen()避免所有的pinvoke。@HansPassant请看一下我的更新。这就是你所指的吗?我只得到一个白色(255255)像素。
[DllImport("gdi32.dll")]
static extern COLORREF GetPixel(IntPtr hdc, int nXPos, int nYPos);

[StructLayout(LayoutKind.Sequential)]


public struct COLORREF
{
    public uint ColorDWORD;

    public COLORREF(System.Drawing.Color color)
    {
        ColorDWORD = (uint)color.R + (((uint)color.G) << 8) + 
                                     (((uint)color.B) << 16);
    }

    public System.Drawing.Color GetColor()
    {
        return System.Drawing.Color.FromArgb((int)(0x000000FFU & ColorDWORD),
    (int)(0x0000FF00U & ColorDWORD) >> 8, (int)(0x00FF0000U & ColorDWORD) >> 16);
    }

    public void SetColor(System.Drawing.Color color)
    {
        ColorDWORD = (uint)color.R + (((uint)color.G) << 8)
                            + (((uint)color.B) << 16);
    }
}