Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как при выполнении цикла перехватить нажатие на клавишу 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 (потоки)

В хелпе посмотри и в семплах как с ними работать


Наверх

Титульная страница Поиск, карта сайта Написать письмо