Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];

Вниз

Как при выполнении цикла перехватить нажатие на клавишу 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.037 c
1-1110461672
syte_ser78
2005-03-10 16:34
2005.03.27
сколько дней между двумя датами


3-1109589918
Dysan
2005-02-28 14:25
2005.03.27
TClientDateSet сохранить в DBF


6-1106907685
ТехникПТО
2005-01-28 13:21
2005.03.27
OnNewWindow2 в динамически созданном браузере


1-1110555153
deDalta
2005-03-11 18:32
2005.03.27
TreeView


9-1101563055
negrila
2004-11-27 16:44
2005.03.27
Поиск путей на графе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский