Search code examples
c#colorsfullscreenpixelintptr

Get middle screen pixel (color) in C# (full screen game)?


I'm running a full screen game and I'm trying to find out the color of the middle pixel. The code I'm using however, seems to only work with windowed applications/games/etc. This is my code:

public static Color GetPixelColor(int x, int y) 
{
    IntPtr hdc = GetDC(IntPtr.Zero);
    uint pixel = GetPixel(hdc, x, y);
    ReleaseDC(IntPtr.Zero, hdc);
    Color color = Color.FromArgb((int)(pixel & 0x000000FF),
            (int)(pixel & 0x0000FF00) >> 8,
            (int)(pixel & 0x00FF0000) >> 16);

    return color;
} 

I'm getting the middle screen pixel like this:

int ScreenWidth = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;
int ScreenHeight = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;

So how can I make this code compatible with full screen games? It gives me an ARGB value of A = 255, R = 0, G = 0, B = 0, even though I'm 100% positive that the middle screen pixel is RED.


Solution

  • What's about:

    //using System.Windows.Forms;
    public static Color GetPixelColor(int x, int y) 
    {
        Bitmap snapshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
    
        using(Graphics gph = Graphics.FromImage(snapshot))  
        {
            gph.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
        }
    
        return snapshot.GetPixel(x, y);
    } 
    

    Then:

    Color middleScreenPixelColor = GetPixelColor(Screen.PrimaryScreen.Bounds.Width/2, Screen.PrimaryScreen.Bounds.Height/2);