![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Доброго времени суток! 
		
	
		
		
			Слепил простенькую программку, она же автокликер, коих на просторах инета много. Но есть один ньюанс. Мне нужно правильно прописать условие. Теперь по точнее. Я получаю координаты трех точек на экране и записываю их в 6 компонентов Edit, X и Y соответственно для каждой точки в отдельный компонент. Далее смысл таков, программа дожна с некоторым интервалом делать проверку с таким условием, что если в этих трех точках (во всех сразу) присутвует определенный цвет ( в данном случае HEX #151300 или RGB (21, 19, 0)) то работа программы останавливается, равно также если это условие присутствует в начале работы программы - то не кликает вообще. Помогите, если не сложно, прописать данное условие. Код: 
	procedure TForm1.Button1Click(Sender: TObject);
begin
  if SpinEdit1.Text='0' then
  showmessage('Не указан интервал кликов')
  else begin
  Timer3.Interval:=StrToInt(SpinEdit1.Text);
  Timer3.Enabled:=True;
  button1.Enabled:=False;
  button2.Enabled:=True;
end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Timer3.Enabled:=False;
  Timer1.Enabled:=True;
  Timer2.Enabled:=True;
  button2.Enabled:=False;
  button1.Enabled:=True;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var
  p: TPoint;
  begin
  GetCursorPos(p);
  Edit3.Text:= IntToStr(p.X);
  Edit4.Text:= IntToStr(p.Y);
end;
 
procedure TForm1.Button4Click(Sender: TObject);
var
  p: TPoint;
  begin
  GetCursorPos(p);
  Edit5.Text:= IntToStr(p.X);
  Edit6.Text:= IntToStr(p.Y);
end;
 
procedure TForm1.Button5Click(Sender: TObject);
var
  p: TPoint;
  begin
  GetCursorPos(p);
  Edit7.Text:= IntToStr(p.X);
  Edit8.Text:= IntToStr(p.Y);
end;
 
procedure TForm1.Button6Click(Sender: TObject);
begin
  close;
end;
 
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width, Height,
  SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE );
end;
 
procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
  If Msg.CharCode = 81 then // Клавиша Q - устанавливает координаты первой контрольной точки
  begin
    Button3.Click;
    Handled := True;
  end
 
  else If Msg.CharCode = 87 then // Клавиша W - устанавливает координаты второй контрольной точки
  begin
    Button4.Click;
    Handled := True;
  end
 
  else If Msg.CharCode = 69 then // Клавиша E - устанавливает координаты третьей контрольной точки
  begin
    Button5.Click;
    Handled := True;
  end
 
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
  p: TPoint;
  begin
    GetCursorPos(p);
    Edit1.Text:= IntToStr(p.X);
    Edit2.Text:= IntToStr(p.Y)
end;
 
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  if getasynckeystate($55)<>0 then begin //Если нажат Ctrl, то ...
  Timer1.Enabled:=False;
  Timer2.Enabled:=False;
end;
end;
 
procedure TForm1.Timer3Timer(Sender: TObject);
var
position: TPoint;
begin
  if getasynckeystate($20)<>0 then begin // Если нажат пробел, то перестать кликать
  Timer1.Enabled:=True;
  Timer2.Enabled:=True;
  Timer3.Enabled:=False;
  button1.Enabled:=True;
  button2.Enabled:=False;
  end
 
  else begin
  SetCursorPos(StrToInt(Edit1.text),StrToInt(Edit2.text));
  mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
  mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
end;
end;Проект прилагаю - Click.ZIP Спасибо заранее!  | 
| 
		 
			 
			#3  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Ну, в теории все просто. 
		
	
		
		
		
		
		
	
		
		
	
	
	Берешь снимок десктопа (в битмап), потом получаешь цвет по своим координатам (с приведением к экранным), ну а дальше сверяешь со значением. На практике могут начаться проблемы. Раз. Если десктоп большой, то такой процесс будет жрать время и память. Тут можно подумать на тему того, что можно копировать только часть десктопа вокруг интересующей точки. Два. В следствии сглаживания и других прибабахов, цвет точки может слегка поплыть. Соовтественно, я бы проверял а) покомпонентно, т.е. отдельно R, G и B. б) проверял в некотором интервале, например, при значении компонента R=128 в образеце, проверял бы на попадание в интервал 125-131. Тут придется подбирать эмпирически.  | 
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
 
LIONSMILE (27.06.2018)
  | ||
| 
		 
			 
			#4  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Lmikle, большое спасибо за совет! Я сделал нечто похожее. Я почитал еще и немного изменил логику программы. Ввиду действительно очень весомых факторов, так как экран широкоформатный с разрешением видеоизображения 1920×1080 пикселей. Проверять весь его это будет целая вечность, да и ресурсы будет кушать мягко говоря очень жестко, а если еще и с некой периодичностью - то вообще жесть. Для этих целей использовал небольшой сканер участка экрана, путем задания ему области по координатам, и соответвественно при сканировании указываю искомый цвет, который должен попадать в эту область. Если Сканер находит определенный цвет в этой области, по программа продолжает работать, если в данном участке искомого цвета нет, то программа переходит в режим ожидания, до момента появления в указанной области искомого цвета, при этом сканер работает постоянно, проверяя его наличие в это самой области.  
		
	
		
		
		
		
		
	
		
		
	
	
	Так получилось и куда проще и логичнее и менее затратно для ресурсов системы. А по поводу того, что пикселе на экране бывают смазаны я в курсе, с графикой давно работаю, на первый взгляд видишь на экране один цвет, а там их ого-го сколько в оттенках, например шрифт по краям сглаживается и оттенки цвет меняются. Но в моем случае это не столько важно у меня всего два цвета получается - желтый и черный, и по логике моей программы, выбрав желтый цвет (определил с помощью доп. софта, но хочу сделать что-то типа аналога пипетки, как в paint) в компоненте ColorDialog я делаю его исходным, и потом запускаю уже сканер на проверку определенного участка, если такого цвета там нет, то программа становится в режим ожидания. Еще раз спасибо за помощь!  |