Нужен резидент, блокирующий нажатие CTRL+Break.
Что происходит при нажатии этих клавиш?
Осуществить блокировку требуется программно, т.к. соответствующая команда ДОС не работает!
Вроде была какая-то переменная окружения в ДОСе.
А что, разве в TP не работает SetCBreak(False) и checkbreak:=false ?
GoodWind
28.09.2004 20:23
Цитата
Вроде была какая-то переменная окружения в ДОСе
break=off вроде ;)
Цитата
break=off вроде
Если бы было так просто, я бы не спрашивал. :P
SetCBreak(False);
не работает!, потому что он устанавливает переменную окружения ДОС в нужное значение. Но в ДОСе почему -то не работает эта функция (во всяком случае у меня, значит и еще у кого-то)
checkbreak:=false; устанавливая так переменную, модуль CRT хранит вектор прерывания и обрабатывает нажатие CTRL+BREAK на уровне прерываний.
Вот почему работает
checkbreak:=false и НЕ работает
SetCBreak(False); А почему переменная окружения ДОС не исполняет своих обязанностей?
SKVOZNJAK
1.10.2004 17:39
Попробуй ту же прогу протестить в реальном досе, может винда не даёт тебе выполнить эту операцию.
Пробовал!
Нет, не работает дос переменная окружения!
Цитата
Нет, не работает дос переменная окружения!
интересный, извините за выражение, гемморой .... тоже займусь, из спортивного интереса, блокировкой Ctrl+break
А вот за я зык тебя никто не тянул.
Будешь мне помогать ...
Вот прога:
Код
uses DOS,CRT;
var
i:byte;
begin
{SetCBreak(False);} {*}
checkbreak:=false; {**}
i:=1;
writeln('START, vvedite parol:');
readln(i);
end.
По очереди будешь раскоментировать строки * и ** , скажешь какая работает а какая нет! :D
Цитата
Будешь мне помогать ...
да пжалста...
----
извиняюсь за задержку Вынь переставлял ;)
-----
вобщем: с раскоментированной (!) все работает (ноль реакции на нажатие ctrl+break ), но не в пасовском отладчике, а при запуске проги из под коммандной строки.
я так понял, что пасовский дебагер следит за нажатием Ctrl+break ( и ctrl+c тоже) на случай криво написанной проги, т.е. проверка нажатия не встраивается в код при компиляции, а осуществляется им.
в данных условиях, раскоментировать вторую строку я не стал
фуф...
ну значит мои размышления верны. Я счастлив!
Рад помочь,
Цитата
помогая друг другу, мы справимся с любыми трудностями!
[offtop]
Олег, у тебя юбилейное, 900 сообщение :p10:
[/offtop]
checkbreak:=false;
и усе. при его примениении SetCBreak(False) уже не обязательно, и библиотеку DOS мона не подключать, а обойтись тока CRT )
godd, если бы Вы внимательно прочти сказанное выше, Вы бы не оставили здесь свой неудачный пост.
Цитата
Виновата имеено винда
аналогично!
у меня и под Виндой блокируется (ME).
Цитата
у меня и под Виндой блокируется (ME).
надо-же
я серьезно говорю. Винда - MilleniumEdition, Ctrl+Break - блокируется через checkbreak:=false модуля CRT (в help'e написано что он и под виндами пашет, и отключает не тока Ctrl+Break но и Alt+F4 и еще чо-то - кому интересно в справке), просто Break - останавливает прогу до нажатия клавиши
Цитата
я серьезно говорю. Винда - MilleniumEdition, Ctrl+Break - блокируется через checkbreak:=false модуля CRT (в help'e написано что он и под виндами пашет, и отключает не тока Ctrl+Break но и Alt+F4 и еще чо-то - кому интересно в справке), просто Break - останавливает прогу до нажатия клавиши
Это всем известно
Цитата
просто Break - останавливает
Ничего он не останавливает!
Это останавливает клавиша PAUSE, просто они 2 клавиши сидят физически на одной, но при нажатии PAUSE и PAUSE (break) и еще какой-нибудь вырабатываютсяразные скан-коды. !
Oleg_Z
я имел ввиду паузу.
BlackShadow
8.10.2004 1:50
Не стал дочитывать до конца - влом как-то. Есть такой Int интересный, который вызывается как реакция на Ctrl+Break. Вроде 24h. Его адрес ещё в PSP прописывается. Можно было бы его перехватить... Хотя, что на это скажет винда - не знаю.
Ага, спасибо BlackShadow, именно мне это и надо!
перхват прерывания самое надежное дело!
BlackShadow
а ты почитай, там вывод: checkbreak из модуля crt решает данную задачу
Дело в том, что из модуля то решает но инстерсно как там все работает!
Oleg_Z
понятно. просто я на ассме не разбираюсь, и не до конца понимаю, где он может пригодиться (ну мелкие там функции для прог - это и я, если поднапрячся и сильно надо будет смогу, а по-крупному?)
BlackShadow
19.10.2004 2:26
godd, тогда и не пытайся учить старших
CheckBreak определяет набор функций DOS'а, которые используются при вводе выводе самим модулем. А вот
Oleg_Z, может относит себя к тем, что не станет рисковать Runtime Error'ом 200 из-за какого-то CheckBreak'а.
BlackShadow
я и не пытаюсь ;)
мне просто интересно )
Прерывание Int 23h активизируется из системных вызовов DOS, проверяющих буфер клавиатуры (в основном функции консольного ввода-вывода), и возникает при обнаружении в буфере сочетания Ctrl-C. При нажатии Ctrl-Break происходит более сложная комбинация: контроллер клавиатуры -> IRQ1 <=> Int 9 -> Int 1Bh - обработчик Ctrl-Break BIOS'а, по умолчанию вставляет Ctrl-C в буфер клавиатуры.
Вектор Int 23h не требует восстановления перед выходом из программы: после завершения программы DOS сама присваивает стандартные значения векторам Int 22h, 23h, 24h.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.