【发布时间】:2012-05-17 22:36:42
【问题描述】:
我正在尝试为 Windows 应用程序制作自动点击器。它运作良好,但速度非常慢! 我目前正在使用“getPixel”方法,每次调用它都会重新加载一个数组。
这是我当前的代码:
hdc = GetDC(HWND_DESKTOP);
bx = GetSystemMetrics(SM_CXSCREEN);
by = GetSystemMetrics(SM_CYSCREEN);
start_bx = (bx/2) - (MAX_WIDTH/2);
start_by = (by/2) - (MAX_HEIGHT/2);
end_bx = (bx/2) + (MAX_WIDTH/2);
end_by = (by/2) + (MAX_HEIGHT/2);
for(y=start_by; y<end_by; y+=10)
{
for(x=start_bx; x<end_bx; x+=10)
{
pixel = GetPixel(*hdc, x, y);
if(pixel==RGB(255, 0, 0))
{
SetCursorPos(x,y);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Sleep(50);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Sleep(25);
}
}
}
所以基本上,它只是扫描屏幕上的像素范围,如果检测到红色按钮,就会启动鼠标事件。
我知道还有其他方法可以获取像素颜色,例如 bitblt。但是我已经进行了一些研究,但我不明白我应该怎么做才能扫描颜色阵列。我需要能够快速扫描屏幕的东西才能抓住按钮。
你能帮帮我吗?
谢谢。
【问题讨论】:
-
什么时候调用你的代码?在空闲时间?当用户移动鼠标时?有多种方法可以检测红色按钮,例如使用 FindWindow()。
-
顺便说一句,我的代码处于无限循环中。但我想使用一个颜色捕捉器,而一个偏移的。所以,当我开始我的代码时,它只是进入循环并检查红色按钮。
-
如果这段代码处于无限循环中,那么问题就不是
GetPixel。事实上,您的应用不让其他应用拥有任何 CPU 时间。 -
顺便说一句,我所有的东西都在一个线程中。正如我所说,它适用于 getPixel。我只是在寻找更好的方法来做到这一点
-
效果不好——你说它很慢。如果没有分析数据,我给出了它慢的最好理由。