![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как при выполнении цикла перехватить нажатие на клавишу Escape [D6]
Пубертанец © (2005-03-15 11:59:00)Есть цикл, который может выполняться достаточно долго. В цикле надо перехватить нажатие на клавишу Escape и прервать выполнение. Application.ProcessMessages использовать строго запрещено (по некоторым соображениям). Поэтому как можно еще отловить это?
Заранее спасибо.
Пубертанец (2005-03-15 15:26:00) [1]Ой, чё-то я уже попутал. Вроде работает нормально. На (17) не смотрите.
Спасибо всем
_1 (2005-03-15 15:09:00) [2]Application.Handle - это дескриптор окна (кнопки) на панели задач.
Пубертанец (2005-03-15 15:06:00) [3]2 (_1):
if (Lo(GetAsyncKeyState(VK_ESCAPE)) = 1)
and (GetForegroundWindow() = ...
это работает стабильно.
В общем, цель уже достигнута - спасибо всем, но чтобы до конца добить - следующий вопрос: допустим цикл запущен в моем приложении, я перехожу в другое приложение, а затем хочу вернуться к своему и нажать на Escape. Естественно не получается, т.к. окно не активизируется (хотя на панели задач оно горит как активное) и Escape не срабатывает. Как решить?
Vit@ly (2005-03-15 14:52:00) [4]Извиняюсь, пропустил ...
Пубертанец (2005-03-15 14:49:00) [5]Уже поделился - (3)
Vit@ly (2005-03-15 14:40:00) [6]Application.ProcessMessages использовать строго запрещено ( по некоторым соображениям)
А соображениями поделиться хотя бы можно?:)
Anatoly Podgoretsky (2005-03-15 14:23:00) [7]Пубертанец (15.03.05 13:53) [8]
Правильно, это в обход очереди сообщений, а очередь сообщений тебя не устраивает.
Набережных С. (2005-03-15 14:16:00) [8]А нет, извиняюсь, невнимательность:(
Набережных С. (2005-03-15 14:14:00) [9]
> в главном приложении есть функция, которая срабатывает на
> OnTimer. Если не использовать Application.ProcessMessages,
> то эта функция не сработает (что и необходимо). Боюсь, если
> для моего цикла создать отдельный поток, то эта функция
> сработает
Не сработает. Но хук все равно лучше:)
Пубертанец (2005-03-15 14:12:00) [10]Это другое дело. Вообще работает, но почему-то теперь приходится по нескольку раз нажимать на Escape, чтобы цикл остановился. Без GetForegroundWindow реагирует на Escape с первого раза.
_1 (2005-03-15 13:59:00) [11]Ну, ещё можно проверку устроить типа такой
if (GetForegroundWindow() = Handle) and ...
Пубертанец (2005-03-15 13:53:00) [12](4) - GetAsyncKeyState - хорошая вещь, но она реагирует на нажатие на Escape не только в моем приложении, а во всех приложениях. Например, я запустил этот цикл у себя в прикладухе, потом перешел на другое приложение, там нажал на Escape, а GetAsyncKeyState в моем цикле среагирует на это нажатие.
mozart (2005-03-15 13:10:00) [13]может DirectInput из DirectX попробуй...
Юрий Зотов (2005-03-15 12:56:00) [14]> Пубертанец (15.03.05 12:37) [3]
WM_TIMER идет через очередь - значит, можно поставить хук WH_GETMESSAGE, глушить в нем это сообщение и забыть о таймере.
А потом - хоть поток делать, хоть ProcessMessages вызывать.
Erik1 (2005-03-15 12:52:00) [15]Может GetAsyncKeyState попробовать, но совершено непонятен вопрос. Что так сработат, кто не должен сработать, чем поток неугодил.
_1 (2005-03-15 12:49:00) [16]
for i:= 0 to 100000 do
begin
Caption:= IntToStr(i);
if (Word(GetAsyncKeyState(VK_ESCAPE)) and $8000)<> 0 then
Break;
end;
Пубертанец (2005-03-15 12:37:00) [17]Насчет Thread - боюсь, что Thread нельзя будет использовать по тем же причинам, что и Application.ProcessMessages. Мое приложение - это длл-ка, а в главном приложении есть функция, которая срабатывает на OnTimer. Если не использовать Application.ProcessMessages, то эта функция не сработает (что и необходимо). Боюсь, если для моего цикла создать отдельный поток, то эта функция сработает, а это критично.
(2) - этот код без Application.ProcessMessages не сработает
Ольга (2005-03-15 12:27:00) [18]procedure Form1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=27 then ...
end; » Юрий Зотов: » Увы, Ольга, проблема не в этом. А в том, что без Application.ProcessMessages (которое использовать нельзя) или без дополнительного потока (о котором уже говорилось в [1]) этот код не сработает.
alsov (2005-03-15 12:19:00) [19]Используй Thread (потоки)
В хелпе посмотри и в семплах как с ними работать