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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2015, 10:07   #1
vers0
Пользователь
 
Регистрация: 30.11.2011
Сообщений: 18
Вопрос Прекращение работы программы.

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

Суть проблемы такова: если, к примеру, ставить/снимать "галку" в 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.
vers0 вне форума Ответить с цитированием
Старый 25.10.2015, 10:27   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Выносить в отдельный поток не вариант
Как раз вариант
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.10.2015, 17:01   #3
vers0
Пользователь
 
Регистрация: 30.11.2011
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Как раз вариант
а если клики будут постоянны? за 30-40 минут нагрузит систему созданием-разрушением потока...
vers0 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WPF-WebBrowser Awesomium - Прекращение работы приложения valkiriy C# (си шарп) 5 09.04.2013 13:47
прекращение работы цикла ms.yur Паскаль, Turbo Pascal, PascalABC.NET 9 03.04.2011 12:28
Прекращение работы программы EddieG Общие вопросы C/C++ 2 16.01.2011 22:52
Прекращение выполнения макроса AesmaDiv Microsoft Office Excel 6 12.12.2010 18:30
Подскажите что написать в пункте "Описание работы программы" курсовой работы Marsel737 Свободное общение 3 14.01.2010 12:44