Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.27;
Скачать: CL | DM;

Вниз

Как при выполнении цикла перехватить нажатие на клавишу Escape   Найти похожие ветки 

 
Пубертанец   (2005-03-15 11:59) [0]

Есть цикл, который может выполняться достаточно долго. В цикле надо перехватить нажатие на клавишу Escape и прервать выполнение. Application.ProcessMessages использовать строго запрещено (по некоторым соображениям). Поэтому как можно еще отловить это?

Заранее спасибо.


 
alsov ©   (2005-03-15 12:19) [1]

Используй Thread (потоки)

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


 
Ольга   (2005-03-15 12:27) [2]

procedure Form1.FormKeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if key=27 then ...
end;» Юрий Зотов:» Увы, Ольга, проблема не в этом. А в том, что без Application.ProcessMessages (которое использовать нельзя) или без дополнительного потока (о котором уже говорилось в [1]) этот код не сработает.


 
Пубертанец   (2005-03-15 12:37) [3]

Насчет Thread - боюсь, что Thread нельзя будет использовать по тем же причинам, что и Application.ProcessMessages. Мое приложение - это длл-ка, а в главном приложении есть функция, которая срабатывает на OnTimer. Если не использовать Application.ProcessMessages, то эта функция не сработает (что и необходимо). Боюсь, если для моего цикла создать отдельный поток, то эта функция сработает, а это критично.

(2) - этот код без Application.ProcessMessages не сработает


 
_1   (2005-03-15 12:49) [4]

 for i:= 0 to 100000 do
 begin
   Caption:= IntToStr(i);
   if (Word(GetAsyncKeyState(VK_ESCAPE)) and $8000)<> 0 then
     Break;
 end;


 
Erik1 ©   (2005-03-15 12:52) [5]

Может GetAsyncKeyState попробовать, но совершено непонятен вопрос. Что так сработат, кто не должен сработать, чем поток неугодил.


 
Юрий Зотов ©   (2005-03-15 12:56) [6]

> Пубертанец   (15.03.05 12:37) [3]

WM_TIMER идет через очередь - значит, можно поставить хук WH_GETMESSAGE, глушить в нем это сообщение и забыть о таймере.

А потом - хоть поток делать, хоть ProcessMessages вызывать.


 
mozart   (2005-03-15 13:10) [7]

может DirectInput из DirectX попробуй...


 
Пубертанец   (2005-03-15 13:53) [8]

(4) - GetAsyncKeyState - хорошая вещь, но она реагирует на нажатие на Escape не только в моем приложении, а во всех приложениях. Например, я запустил этот цикл у себя в прикладухе, потом перешел на другое приложение, там нажал на Escape, а GetAsyncKeyState в моем цикле среагирует на это нажатие.


 
_1   (2005-03-15 13:59) [9]

Ну, ещё можно проверку устроить типа такой
if (GetForegroundWindow() = Handle) and ...


 
Пубертанец   (2005-03-15 14:12) [10]

Это другое дело. Вообще работает, но почему-то теперь приходится по нескольку раз нажимать на Escape, чтобы цикл остановился. Без GetForegroundWindow реагирует на Escape с первого раза.


 
Набережных С. ©   (2005-03-15 14:14) [11]


> в главном приложении есть функция, которая срабатывает на
> OnTimer. Если не использовать Application.ProcessMessages,
> то эта функция не сработает (что и необходимо). Боюсь, если
> для моего цикла создать отдельный поток, то эта функция
> сработает

Не сработает. Но хук все равно лучше:)


 
Набережных С. ©   (2005-03-15 14:16) [12]

А нет, извиняюсь, невнимательность:(


 
Anatoly Podgoretsky ©   (2005-03-15 14:23) [13]

Пубертанец   (15.03.05 13:53) [8]
Правильно, это в обход очереди сообщений, а очередь сообщений тебя не устраивает.


 
Vit@ly ©   (2005-03-15 14:40) [14]

Application.ProcessMessages использовать строго запрещено (по некоторым соображениям)
А соображениями поделиться хотя бы можно?:)


 
Пубертанец   (2005-03-15 14:49) [15]

Уже поделился - (3)


 
Vit@ly ©   (2005-03-15 14:52) [16]

Извиняюсь, пропустил ...


 
Пубертанец   (2005-03-15 15:06) [17]

2 (_1):

if (Lo(GetAsyncKeyState(VK_ESCAPE)) = 1)
   and (GetForegroundWindow() = ...
это работает стабильно.

В общем, цель уже достигнута - спасибо всем, но чтобы до конца добить - следующий вопрос: допустим цикл запущен в моем приложении, я перехожу в другое приложение, а затем хочу вернуться к своему и нажать на Escape. Естественно не получается, т.к. окно не активизируется (хотя на панели задач оно горит как активное) и Escape не срабатывает. Как решить?


 
_1   (2005-03-15 15:09) [18]

Application.Handle - это дескриптор окна (кнопки) на панели задач.


 
Пубертанец   (2005-03-15 15:26) [19]

Ой, чё-то я уже попутал. Вроде работает нормально. На (17) не смотрите.

Спасибо всем



Страницы: 1 вся ветка

Текущий архив: 2005.03.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.109 c
14-1109578732
Tornado
2005-02-28 11:18
2005.03.27
Не работает Windows Update


14-1110189948
vecna
2005-03-07 13:05
2005.03.27
FlexGraphics


1-1110443331
ctranik
2005-03-10 11:28
2005.03.27
Проблемы с System Tree


3-1109236444
v.topalov
2005-02-24 12:14
2005.03.27
Полетела база Inerbase 5.6


3-1109661909
Чеширский_Кот
2005-03-01 10:25
2005.03.27
Data provider or other service returned an E_FAIL status