При установке хука на мышь нужно по нажатию левой кнопки выполнять какие-либо действия, а при ее отжатии останавливать выполнение.
Суть проблемы такова: если, к примеру, ставить/снимать "галку" в CheckBox'e по нажатию/отжатию, то все нормально и быстро, но если прописать по нажатию кнопки что-то более длинноиграющее, то пока полностью не отработает функция - не прекращается.
Выносить в отдельный поток не вариант, т.к. пользователь может нажимать кнопку мыши раз в минуту, а может и по 100 раз в секунду (ну, если пальцы не отвалятся

)
Как прервать на произвольном месте и при повторном нажатии запустить заново?
Код:
procedure TForm1.WndProc(var Msg: TMessage);
if (Msg.Msg = MWM_LBUTTONDOWN) then
begin
GetCursorPos(p);
SetCursorPos(p.X-5, p.Y+5);
Sleep(85);
Application.ProcessMessages;
GetCursorPos(p);
SetCursorPos(p.X-5, p.Y+5);
Sleep(85);
Application.ProcessMessages;
GetCursorPos(p);
SetCursorPos(p.X+5, p.Y+5);
Sleep(85);
Application.ProcessMessages;
GetCursorPos(p);
SetCursorPos(p.X-5, p.Y+5);
Sleep(85);
Application.ProcessMessages;
GetCursorPos(p);
SetCursorPos(p.X+5, p.Y+5);
Sleep(85);
Application.ProcessMessages;
GetCursorPos(p);
SetCursorPos(p.X-5, p.Y+5);
Sleep(85);
Application.ProcessMessages;
GetCursorPos(p);
SetCursorPos(p.X+5, p.Y+5);
Sleep(85);
Application.ProcessMessages;
GetCursorPos(p);
SetCursorPos(p.X+5, p.Y+5);
Sleep(85);
Application.ProcessMessages;
GetCursorPos(p);
SetCursorPos(p.X-5, p.Y+5);
Sleep(85);
Application.ProcessMessages;
GetCursorPos(p);
SetCursorPos(p.X-5, p.Y+5);
Sleep(85);
Application.ProcessMessages;
GetCursorPos(p);
SetCursorPos(p.X+5, p.Y+5);
Sleep(85);
Application.ProcessMessages;
end;
if (Msg.Msg = MWM_LBUTTONUP) then
begin
Exit;
end;
initialization
MWM_LBUTTONDOWN := RegisterWindowMessage('MWM_LBUTTONDOWN');
MWM_LBUTTONUP := RegisterWindowMessage('MWM_LBUTTONUP');
end.