I have come up with a version that uses CopyFromScreen like this:
public Color getScrColor(Control ctl, Point location)
{
Bitmap bmp = new Bitmap(1, 1);
Graphics g = Graphics.FromImage(bmp);
Point screenP = ctl.PointToScreen(location);
g.CopyFromScreen(screenP.X, screenP.Y, 0, 0, new Size(1, 1));
Color col = bmp.GetPixel(0, 0);
bmp.Dispose();
return col;
}
It works fine, too but seems to be a lot slower (by a factor of 10) than the one that uses DrawToBitmap. I doubt that the PointToScreen is the reason and a test version, that hands over a Graphics without creating it each time was just as slow.
So I guess the CopyFromScreen call is so much slower, that the number of pixels is not important. Well, within reasonable limits, probably. My color palette Control is about 60x400 pixels.
So for the time being I guess the original GetColor solution is OK to use.