Я знаю, что есть несколько таких «способов получить цвет пикселя экрана»? вопросы, но когда я пытаюсь их решения, я не получаю достаточно хороших результатов.Как получить максимальный цвет пикселя экрана (C#)
Я делаю приложение, которое снова и снова обнаруживает цвета 4 разных пикселей и обрабатывает результаты. Проблема в том, что когда я пытаюсь выполнить код, он может запускать всего несколько циклов в секунду, и мне нужно не менее 100 циклов в секунду (это означает, что 400 пиксельных обнаружений в секунду).
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll", SetLastError = true)]
public static extern IntPtr GetWindowDC(IntPtr window);
[DllImport("gdi32.dll", SetLastError = true)]
public static extern uint GetPixel(IntPtr dc, int x, int y);
[DllImport("user32.dll", SetLastError = true)]
public static extern int ReleaseDC(IntPtr window, IntPtr dc);
private Color GetColorAt(int x, int y)
{
IntPtr desk = GetDesktopWindow();
IntPtr dc = GetWindowDC(desk);
int a = (int)GetPixel(dc, x, y);
ReleaseDC(desk, dc);
return Color.FromArgb(255, (a >> 0) & 0xff, (a >> 8) & 0xff, (a >> 16) & 0xff);
}
private void record()
{
sw.Start();
while(isRunning)
{
Color cK1 = GetColorAt(1857, 488);
Color cK2 = GetColorAt(1857, 556);
Color cM1 = GetColorAt(1857, 624);
Color cM2 = GetColorAt(1857, 692);
if (cK1.R + cK1.G + cK1.B > 750 && !k1pressed)
{
k1pressed = true;
addEvent("DOWN", "K1");
}
else if (cK1.R + cK1.G + cK1.B < 30 && k1pressed)
{
k1pressed = false;
addEvent("UP", "K1");
}
if (cK2.R + cK2.G + cK2.B > 750 && !k2pressed)
{
k2pressed = true;
addEvent("DOWN", "K2");
}
else if (cK2.R + cK2.G + cK2.B < 30 && k2pressed)
{
k2pressed = false;
addEvent("UP", "K2");
}
if (cM1.R + cM1.G + cM1.B > 750 && !m1pressed)
{
m1pressed = true;
addEvent("DOWN", "M1");
}
else if (cM1.R + cM1.G + cM1.B < 30 && m1pressed)
{
m1pressed = false;
addEvent("UP", "M1");
}
if (cM2.R + cM2.G + cM2.B > 750 && !m2pressed)
{
m2pressed = true;
addEvent("DOWN", "M2");
}
else if (cM2.R + cM2.G + cM2.B < 30 && m2pressed)
{
m2pressed = false;
addEvent("UP", "M2");
}
labelStatus.Text = "Recording: " + sw.ElapsedMilliseconds.ToString();
Application.DoEvents();
}
}
Для объяснения, мое приложение захватывает 4 пикселя, и каждый из этих пикселей представляет собой один (виртуальных) клавишной клавиатуры или мыши кнопки (скажем, A, B, LMB, ПКМ) и addEvent (ул НТР) только путы информация о нажатии или отпускании клавиши в строке и после остановки записи сохраняет строку в файл.
Есть ли способ сделать что-то подобное 100 раз в секунду? Потому что я думал, что работа с 4 пикселями должна быть действительно быстрой.
Нет смысла делать это с более высокой скоростью, чем частота обновления видео. –