Я ищу самый быстрый способ захватить цвет одного пикселя экрана в С#. Пока я использую методы GDI+ с System.Threading.Timer, который вызывает функцию захвата в своем обратном вызове, но я ищу наиболее оптимальный способ достижения моей цели
Мой текущий код работает так
System.Threading.Timer stTimer = new System.Threading.Timer(timerFired, null, 0, 1);
который вызывает функцию, содержащую этот метод
[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);
[DllImport("user32.dll")]
static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC);
Bitmap screenPixel = new Bitmap(1, 1);
IntPtr hdcMem = CreateCompatibleDC(IntPtr.Zero);
using (Graphics gdest = Graphics.FromImage(screenPixel))
{
using (Graphics gsrc = Graphics.FromHwnd(appWindow))
{
int y = 540;
Point loc = new Point(xVal, y);
IntPtr hSrcDC = gsrc.GetHdc();
IntPtr hDC = gdest.GetHdc();
int retval = BitBlt(hDC, 0, 0, 1, 1, hSrcDC, loc.X, loc.Y, (int)CopyPixelOperation.SourceCopy);
gdest.ReleaseHdc();
gsrc.ReleaseHdc();
}
}
Color c = screenPixel.GetPixel(0, 0);
но мне также интересно, если метод GetPixel...
[DllImport("gdi32.dll")]
static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos);
... на самом деле может быть быстрее в этом случае получения цвета только для одного пикселя
я тоже подумываю попробовать
[DllImport("user32.dll")]
static extern IntPtr GetWindowDC(IntPtr hWnd);
IntPtr hDC = GetWindowDC(appWindow);
int retval = BitBlt(hDC, 0, 0, 1, 1, hSrcDC, loc.X, loc.Y, (int)CopyPixelOperation.SourceCopy);
и даже пытается
[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);
[DllImport("gdi32.dll", SetLastError = true)]
static extern IntPtr CreateCompatibleDC(IntPtr hdc);
[DllImport("user32.dll")]
static extern IntPtr GetWindowDC(IntPtr hWnd);
IntPtr hDC = CreateCompatibleDC(GetWindowDC(appWindow));
int retval = BitBlt(hDC, 0, 0, 1, 1, hSrcDC, loc.X, loc.Y, (int)CopyPixelOperation.SourceCopy);
но я не совсем уверен, как вообще использовать функцию CreateCompatibleDC в контексте С#, и действительно ли она делает что-то полезное на данный момент...
Я действительно открыт для любых предложений по оптимизации, включая методы вне библиотеки GDI+, если решения совместимы с C# и включают высоко ценимые образцы кода.
Кроме того, меня не очень беспокоит оптимизация таймера, но если у вас есть оптимизации в этом отношении, пожалуйста, поделитесь ими.