比如,我想找到屏幕上某一颜色值为2881ff的点应该怎么做呢,有一种笨方法是从(0,0)到(1027,768)一个个读取值,不过这样太慢了,慢到程序没有响应。
测试过按键精灵里关于在屏幕上找指定颜色的函数,速度超快,即使在(0,0)到(1027,768)范围内查找,用时也仅为0.09秒左右。不明其理。
希望大家指点一二。
问题二:关于如何在屏幕上查找指定的图形?
我试了get hdc后用getpixel遍历,但这样太慢了,如果是在0,0 1023 768的范围里找,程序会失去响应很长时间.
以下是我的实现,不过用不了,太慢了
// FindColorEx(区域左边:整数,区域上边:整数,区域右边:整数,区域下边:整数,颜色:字符串,整数:0-从左上往右下;1-从中心找;2-从右下往左上,相似度:0.3到1之间,1为精确匹配,输出找到的x坐标:整型变量,输出找到的y坐标:整型变量)
//查找屏幕指定区域内的颜色
procedure TForm1.FindColorEx(Left:integer; Top:integer;Right:integer;Down:integer;Color:Dword;FangXiang:integer;Likes:Real;x:integer;y:integer);
var
DC: HDC;
clr: COLORREF;
i,j,fu,z,k,Cishu:integer;
tem:Dword;
//founed:Boolean;
begin
//清除结果,如果成功找到了,则x,y为该颜色的坐标
x:=0;
y:=0;
//founed:=False;
//0-从左往右;1-从中心找;2-从上往下
DC := GetDC(HWND(nil));
case FangXiang of
0:begin
for i:=Top to Down do
begin
for j:=Left to Right do
begin
clr := GetPixel(DC,j,i);
tem:=ColorToRGB(clr)-Color;
if Likes=1 then
begin
if tem=0 then
begin
x:=j;
y:=i;
//添加找到后的操作
break;
end;
end
else
begin
if (tem>=-300) and (tem<= 300) then
begin
x:=j;
y:=i;
//添加找到后的操作
break;
end;
end;
if (x>0) and (y>0) then break;
end;
if (x>0) and (y>0) then break;
end;
end;
1:begin
fu:=1;
Cishu:=Round((Down-Top)/2);
//i=1;
// while i<Cishu do
for i:=1 to Cishu do
begin
for j:=Cishu+Top to Down do
begin
for z:=1 to 2 do
begin
for k:=Left to Right do
begin
clr := GetPixel(DC,k,j+i*fu);
tem:=ColorToRGB(clr)-Color;
{if (tem>=-300) and (tem<= 300) then
begin
x:=j;
y:=i;
//添加找到后的操作
end; }
if Likes=1 then
begin
if tem=0 then
begin
x:=j;
y:=i;
//添加找到后的操作
break;
end;
end
else
begin
if (tem>=-300) and (tem<= 300) then
begin
x:=j;
y:=i;
//添加找到后的操作
break;
end;
end;
fu:=fu*(-1);
if (x>0) and (y>0) then break;
end;
if (x>0) and (y>0) then break;
end;
if (x>0) and (y>0) then break;
end;
if (x>0) and (y>0) then break;
end;
end;
2:begin
for i:=Left to Right do
begin
for j:=Top to Down do
begin
clr := GetPixel(DC,j,i);
tem:=ColorToRGB(clr)-Color;
{
if (tem>=-300) and (tem<= 300) then
begin
x:=j;
y:=i;
//添加找到后的操作
end; }
if Likes=1 then
begin
if tem=0 then
begin
x:=j;
y:=i;
//添加找到后的操作
break;
end;
end
else
begin
if (tem>=-300) and (tem<= 300) then
begin
x:=j;
y:=i;
//添加找到后的操作
break;
end;
end;
end;
if (x>0) and (y>0) then break;
end;
end;
end;
end;
[课程]Linux pwn 探索篇!