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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2013, 21:03   #1
igrok111
Форумчанин
 
Регистрация: 12.07.2012
Сообщений: 140
По умолчанию Остановить выполнение кода, если подвигать мышкой

Только есть один момент. Мой код - это и есть движение мышью. Нужно остановить выполнение цикла, если подвигать мышью рукой, тоесть нужно что б прога поняла, когда курсор сошел с заданого пути, изменил координаты и тд.
Мышь движеться по диагонали таки кодом:
(і:integer - глобальная переменная)
Код:
procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
i:=i+100; 
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, i, i, 0, 0); 
if i=50000 then 
timer1.Enabled:=false; 
end;
Я пробовал делать так:
Код:
procedure TForm1.Timer2Timer(Sender: TObject); 
begin 
GetCursorPos(p); 
if (p.X <>i) or (p.Y<>i) then 
begin 
timer1.Enabled:=false; 
Exit; 
end; 
end;
не работает - он останавливает даже, если я не трогая мышь, сразу останавливает.

и не предлагайте менять в первом таймере на SetCursorPos - это не подходит, только Mouse_Event
igrok111 вне форума Ответить с цитированием
Старый 21.05.2013, 21:28   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

GetCursorPos вас спасет.
Человек_Борща вне форума Ответить с цитированием
Старый 21.05.2013, 21:33   #3
igrok111
Форумчанин
 
Регистрация: 12.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
GetCursorPos вас спасет.
в обоих случаях надо применять? тоесть и двигать мышь надо геткурсором и проверять ?
igrok111 вне форума Ответить с цитированием
Старый 21.05.2013, 21:58   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

По-моему эта задача немного сложнее чем думается...
Расскажи откуда у нее ноги растут, уверен что есть другой более надежный способ ее решения.
Цитата:
GetCursorPos вас спасет.
В теории можно спрогнозировать где будет курсор, и если он оказывается не там - останавливать таймер:
Код:
var mc:TPoint;
...
mc:=Mouse.CursorPos; 
...
procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
i:=i+100;
if (i=50000)or(Mouse.CursorPos.X<>mc.x+i)or(Mouse.CursorPos.Y<>mc.Y+i) then 
timer1.Enabled:=false; 
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, i, i, 0, 0); 
mc:=Mouse.CursorPos; 
end;
Но ИМХО все равно есть шанс на грабли.

По-моему эта задача немного сложнее чем думается...
Расскажи откуда у нее ноги растут, уверен что есть другой более надежный способ ее решения.
I'm learning to live...

Последний раз редактировалось Stilet; 21.05.2013 в 22:04.
Stilet вне форума Ответить с цитированием
Старый 21.05.2013, 22:15   #5
igrok111
Форумчанин
 
Регистрация: 12.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
На самом деле работает если использовать SetCursorPos вместо Mouse_Event, но по некоторым причинам мне это не подходит(сеткурсор не двигает мышью, он просто ставит курсор в определенное место, а мне надо имитировать движение - вот и есть моя задача, ну и потом остановить надо тоже при нарушении движения)
Вот код который работает, но не подходит:
Код:
var
  Form1: TForm1;
  a, b : Integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
a := 10;
b := 10;
SetCursorPos(a, b);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
p: tpoint;
begin
getcursorpos(p);
if (p.x <> a) or (p.Y <> b) then
 begin
 Timer1.Enabled :=False;
 Exit;
end;
a := a + Random(30) + 1;
b := b + Random(30) + 1;
setcursorpos(a, b);
end;

initialization
randomize;
end.
Код:
var mc:TPoint;
...
mc:=Mouse.CursorPos; 
...
procedure TForm1.Timer1Timer(Sender: TObject); 
begin 
i:=i+100;
if (i=50000)or(Mouse.CursorPos.X<>mc.x+i)or(Mouse.CursorPos.Y<>mc.Y+i) then 
timer1.Enabled:=false; 
Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_MOVE, i, i, 0, 0); 
mc:=Mouse.CursorPos; 
end;
у меня при запуске этого кода курсор через 1 секунду просто уходит в левый верхний угол и все

Последний раз редактировалось igrok111; 21.05.2013 в 22:22.
igrok111 вне форума Ответить с цитированием
Старый 22.05.2013, 10:21   #6
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

хмм. а может стоит проверить принадлежит ли координата y заданной пользователем функции? если совпала предполагаемая y, то выходим(можно задать границы совпадения +-10 например). если диагональное движение то y=аx+b. где b это начальная позиция курсора, а это коэффициент наклона. с помощью этой функции легко предсказать нужное положение, а двигать курсор маленькими шажками на 1 по x. при необходимости меняя праметры а и b.
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.
IliaIT вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение PHP кода Sprat PHP 1 31.01.2012 15:12
Остановить выполнение процесса при нажатии на кнопку Aleksandr Microsoft Office Excel 2 04.03.2011 10:28
Как остановить выполнение button.onclick? igabenu Общие вопросы Delphi 6 21.01.2011 23:36
Как остановить выполнение макроса ? kzld Microsoft Office Excel 2 19.07.2009 13:16
Выполнение кода из файла.. NSvirus Паскаль, Turbo Pascal, PascalABC.NET 25 14.06.2009 00:56