【发布时间】:2023-04-05 00:22:01
【问题描述】:
我知道这些“如何获得屏幕像素颜色?”的很少。问题,但是当我尝试他们的解决方案时,我没有得到足够好的结果。
我正在制作一个应用程序,一次又一次地检测 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、RMB),并且 addEvent(str, str) 只是放置有关键的信息按下或释放到字符串中,并在录制停止后将字符串保存到文件中。
有什么方法可以让我每秒做 100 次这样的事情吗?因为我认为仅使用 4 个像素进行操作应该非常快..
【问题讨论】:
-
以高于视频刷新率的速度进行操作是没有意义的。
标签: c# winforms screenshot screen-scraping