Показать сообщение отдельно
  #1  
Старый 25.10.2015, 10:05
vers0 vers0 вне форума
Прохожий
 
Регистрация: 21.12.2013
Адрес: Донецк
Сообщения: 26
Версия Delphi: Delphi 7
Репутация: 10
Вопрос Прекращение работы программы

При установке хука на мышь нужно по нажатию левой кнопки выполнять какие-либо действия, а при ее отжатии останавливать выполнение.

Суть проблемы такова: если, к примеру, ставить/снимать "галку" в 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.
Ответить с цитированием