Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2015, 23:42   #1
ddwnik
Пользователь
 
Регистрация: 02.09.2014
Сообщений: 22
Радость Перемещение мышки в точку клика

Доброго времени суток.
Столкнулся с проблемой - не могу реализовать передвижение мыши в точку клика.
Кликнуть в определенную точку - не проблема, но нужно чтобы мышь плавно перетекла в точку клика.
Прошу помощи!
ddwnik вне форума Ответить с цитированием
Старый 27.01.2015, 01:38   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,877
По умолчанию

Цитата:
Сообщение от ddwnik Посмотреть сообщение
Доброго времени суток.
Столкнулся с проблемой - не могу реализовать передвижение мыши в точку клика.
Кликнуть в определенную точку - не проблема, но нужно чтобы мышь плавно перетекла в точку клика.
Прошу помощи!
Что именно не можешь? Рассчитать траекторию движения? Перемещать указатель мыши в точку с координатами X,Y? Реализовать "плавность" передвижения?
Или нужен готовый код в добавок к коду "клика в определенной точке", который ты уже надыбал во/на всемирной помойке?
Где код твоих попыток решить проблему?
northener вне форума Ответить с цитированием
Старый 27.01.2015, 02:58   #3
ddwnik
Пользователь
 
Регистрация: 02.09.2014
Сообщений: 22
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Что именно не можешь? Рассчитать траекторию движения? Перемещать указатель мыши в точку с координатами X,Y? Реализовать "плавность" передвижения?
Или нужен готовый код в добавок к коду "клика в определенной точке", который ты уже надыбал во/на всемирной помойке?
Где код твоих попыток решить проблему?
Все же решил проблему, но не полностью.
Воткнул 4 таймера:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
foo.x:=foo.x+1;
SetCursorPos(foo.x,foo.y);
if i = foo.x then
begin
  timer1.Enabled:=false;
   timer2.Enabled:=false;
end;

end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
foo.x:=foo.x-1;
SetCursorPos(foo.x,foo.y);

if i = foo.x then
begin
  timer1.Enabled:=false;
   timer2.Enabled:=false;
end;

end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
foo.y:=foo.y+1;
SetCursorPos(foo.x,foo.y);
if j = foo.y then
begin
  timer3.Enabled:=false;
   timer4.Enabled:=false;
end;
end;

procedure TForm1.Timer4Timer(Sender: TObject);
begin
foo.y:=foo.y-1;
SetCursorPos(foo.x,foo.y);
if j = foo.y then
begin
  timer3.Enabled:=false;
   timer4.Enabled:=false;
end;
end;
Код кнопки:
Код:
var p:Tcolor;
    bit:TBitmap;
    flag:boolean;

begin
flag:=false;
p:=rgb(255,214,167);
bit:=TBitmap.Create;
bit.Width := Screen.Width;
bit.Height := Screen.Height;
BitBlt(bit.Canvas.Handle, 0, 0, Width, Height, GetDC(GetDesktopWindow), 0, 0,SRCCOPY );

for i:=0 to bit.Width do begin
  for j:=0 to bit.Height do
    if bit.Canvas.Pixels[i,j]=p then begin
       flag:=true;
       break;
    end;
if flag then
  break;
end;
GetCursorPos(foo);

if (i <> foo.x)  then
begin



if i > foo.x  then
begin
  timer1.Enabled:=true;
end;
if i < foo.x  then
begin
  timer2.Enabled:=true;
end;
if j > foo.y  then
begin
  timer3.Enabled:=true;
end;
if j < foo.x  then
begin
  timer4.Enabled:=true;
end;


end;

SetCursorPos(i,j);
Даже если я на таймерах ставлю интервал в секунду, то все равно скорость движения очень мала.
Необходимо считать координаты, пиксель которых равен цвету и перетащить на них мышь.
Столкнулся с проблемой...
по скольку программа является сторонней, записываю в h= хендл, но после операции выдает координаты на 1 больше, чем мое разрешение монитора. Прошу помощи!

Код:
var 
h: hwnd; 
begin 
h:= Findwindow(nil,'xxx')
BitBlt(bit.Canvas.Handle, 0, 0, Width, Height, GetDC(h), 0, 0,SRCCOPY );

Последний раз редактировалось Stilet; 27.01.2015 в 07:46.
ddwnik вне форума Ответить с цитированием
Старый 27.01.2015, 13:53   #4
NIKOLAYY2
Форумчанин
 
Регистрация: 23.12.2014
Сообщений: 220
По умолчанию

Цитата:
ddwnik координаты на 1 больше, чем мое разрешение монитора. Прошу помощи!
Вот здесь попробуй ширину и высоту указать отняв 1 пискель

Код:
BitBlt(bit.Canvas.Handle, 0, 0, Width, Height, GetDC(h), 0, 0,SRCCOPY );
-----------------------------------------------------------------------
Тебе автокликер с проверкой на цвет точки экрана нужен?
NIKOLAYY2 вне форума Ответить с цитированием
Старый 27.01.2015, 16:28   #5
ddwnik
Пользователь
 
Регистрация: 02.09.2014
Сообщений: 22
По умолчанию

Цитата:
Сообщение от NIKOLAYY2 Посмотреть сообщение
Вот здесь попробуй ширину и высоту указать отняв 1 пискель

Код:
BitBlt(bit.Canvas.Handle, 0, 0, Width, Height, GetDC(h), 0, 0,SRCCOPY );
-----------------------------------------------------------------------
Тебе автокликер с проверкой на цвет точки экрана нужен?
даже если я минусую единицу, координаты те же(1681,1051)

-----------------------------------------------------------------------
именно он, но чтобы было движение мыши в точку клика.
ddwnik вне форума Ответить с цитированием
Старый 27.01.2015, 22:15   #6
NIKOLAYY2
Форумчанин
 
Регистрация: 23.12.2014
Сообщений: 220
По умолчанию

ddwnik
Код:
  //ставим курсор и делаем клик
  setCursorPos(X, Y);
  Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0);
  Application.ProcessMessages;
  Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
NIKOLAYY2 вне форума Ответить с цитированием
Старый 27.01.2015, 23:36   #7
ddwnik
Пользователь
 
Регистрация: 02.09.2014
Сообщений: 22
По умолчанию

Цитата:
Сообщение от NIKOLAYY2 Посмотреть сообщение
ddwnik
Код:
  //ставим курсор и делаем клик
  setCursorPos(X, Y);
  Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0);
  Application.ProcessMessages;
  Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
Вы меня не поняли, я вроде разобрался и немного переписал код.
Но вот в чем проблема:
Мышь двигается в сторону нужных мне координат.
Но после того как она доползет до нужной координаты - нужен клик.
Сижу уже пол дня, голова перестает варить... Не могу нажать мышкой по координатам. Не то чтобы не могу, а просто не въезжаю куда закинуть.
при условии если (j1 =fo.x) and (i1 = fo.y) - нажать мышь.
Вот код:
Код:
var
  Form1: TForm1;
  fo: TPoint;
  i,j,i1,j1:integer;
  ran,ex:integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var
  dx: integer;
  bit: TBitmap;
  flag: boolean;
  t: tdatetime;
  Pixels: PByteArray;
const
  red1 = 10;
  green1 = 44;
  blue1 = 255;
begin
  flag := false;
  bit := TBitmap.Create;
  bit.PixelFormat := pf24bit;
  bit.Width := Screen.Width;
  bit.Height := Screen.Height;
  BitBlt(bit.Canvas.Handle, 0, 0, bit.Width, bit.Height, GetDC(0), 0, 0, SRCCOPY);

  t := now;
  dx := DWord(bit.ScanLine[1]) - DWord(bit.ScanLine[0]);
  Pixels := bit.ScanLine[0];
  for i := 0 to bit.Height - 1 do
  begin
    for j := 0 to bit.Width - 1 do
    begin
      flag := (Pixels[j * 3 + 2] = red1) and (Pixels[j * 3 + 1] = green1) and (Pixels[j * 3] = blue1);
      if flag then
        break;
    end;
    if flag then
      break;
    inc(DWord(Pixels), dx);
  end;
  caption := FormatDateTime('s.zzz', now - t);

  if flag then  begin
  randomize;
     ran:=random(2);
     if ran=0 then  ex:=1;
     if ran=1 then  ex:=-1;

     j1:=j+random(160);
      i1:=i+random(8)*ex;
     GetCursorPos(fo);
     if j1 > fo.x then timer1.Enabled:=true;
     if j1 < fo.x then timer2.Enabled:=true;
     if i1 > fo.y then timer3.Enabled:=true;

     if i1 < fo.y then timer4.Enabled:=true;



  end;

  bit.Free;
end;



procedure TForm1.Timer1Timer(Sender: TObject);
begin
if fo.X = j1  then  begin
timer1.Enabled:=false;
timer2.Enabled:=false;

end;
fo.X:=fo.X+1;
SetCursorPos(fo.X,fo.Y);

end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
if fo.X = j1  then  begin
timer1.Enabled:=false;
timer2.Enabled:=false;
end;
fo.X:=fo.X-1;
SetCursorPos(fo.X,fo.Y);
end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
if fo.y = i1  then  begin
timer3.Enabled:=false;
timer4.Enabled:=false;
end;
fo.y:=fo.y+1;
SetCursorPos(fo.X,fo.Y);
end;

procedure TForm1.Timer4Timer(Sender: TObject);
begin
if fo.y = i1  then  begin
timer3.Enabled:=false;
timer4.Enabled:=false;
end;
fo.y:=fo.y-1;
SetCursorPos(fo.X,fo.Y);
end;

end.
ddwnik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемещение указателя мышки в центр рабочего стола Bronver Общие вопросы C/C++ 15 16.02.2013 16:32
Перемещение указателя мышки в центр рабочего стола Bronver C++ Builder 1 16.02.2013 08:45
перемещение объекта за курсором мышки eu8cc Общие вопросы Delphi 2 28.09.2009 22:48
Имитация клика мышки на экране CRASH009 Общие вопросы Delphi 6 18.08.2008 21:38
Перемещение мышки с Image1 на форму Rusl92 Общие вопросы Delphi 1 27.04.2008 22:46