Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.039 c