Помощь - Поиск - Пользователи - Календарь
Полная версия: Блокировка Ctrl+break - снятия задачи в ДОС
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
Altair
Нужен резидент, блокирующий нажатие CTRL+Break.
Что происходит при нажатии этих клавиш?
Осуществить блокировку требуется программно, т.к. соответствующая команда ДОС не работает!
APAL
Вроде была какая-то переменная окружения в ДОСе.
А что, разве в TP не работает SetCBreak(False) и checkbreak:=false ?
GoodWind
Цитата
Вроде была какая-то переменная окружения в ДОСе

break=off вроде ;)
Altair
Цитата
break=off вроде

Если бы было так просто, я бы не спрашивал. :P
SetCBreak(False); не работает!, потому что он устанавливает переменную окружения ДОС в нужное значение. Но в ДОСе почему -то не работает эта функция (во всяком случае у меня, значит и еще у кого-то)
checkbreak:=false; устанавливая так переменную, модуль CRT хранит вектор прерывания и обрабатывает нажатие CTRL+BREAK на уровне прерываний.
Вот почему работает checkbreak:=false и НЕ работает SetCBreak(False);

А почему переменная окружения ДОС не исполняет своих обязанностей?
SKVOZNJAK
Попробуй ту же прогу протестить в реальном досе, может винда не даёт тебе выполнить эту операцию.
Altair
Пробовал!
Нет, не работает дос переменная окружения!
GoodWind
Цитата
Нет, не работает дос переменная окружения!

интересный, извините за выражение, гемморой .... тоже займусь, из спортивного интереса, блокировкой Ctrl+break
Nebel
Виновата имеено винда
Altair
А вот за я зык тебя никто не тянул. smile.gif
Будешь мне помогать ... smile.gif
Вот прога:

Код

uses DOS,CRT;
var
i:byte;

begin
{SetCBreak(False);} {*}
checkbreak:=false;  {**}
i:=1;
writeln('START, vvedite parol:');
readln(i);
end.


По очереди будешь раскоментировать строки * и ** , скажешь какая работает а какая нет! :D
GoodWind
Цитата
Будешь мне помогать ...

да пжалста...

----

извиняюсь за задержку Вынь переставлял ;)

-----

вобщем: с раскоментированной (!) все работает (ноль реакции на нажатие ctrl+break ), но не в пасовском отладчике, а при запуске проги из под коммандной строки.

я так понял, что пасовский дебагер следит за нажатием Ctrl+break ( и ctrl+c тоже) на случай криво написанной проги, т.е. проверка нажатия не встраивается в код при компиляции, а осуществляется им.

в данных условиях, раскоментировать вторую строку я не стал


фуф...
Altair
ну значит мои размышления верны. Я счастлив!
GoodWind
Рад помочь,
Цитата
помогая друг другу, мы справимся с любыми трудностями!


[offtop]
Олег, у тебя юбилейное, 900 сообщение :p10:
[/offtop]
godd
checkbreak:=false;
и усе. при его примениении SetCBreak(False) уже не обязательно, и библиотеку DOS мона не подключать, а обойтись тока CRT )
Altair
godd, если бы Вы внимательно прочти сказанное выше, Вы бы не оставили здесь свой неудачный пост.
Цитата
Виновата имеено винда

аналогично! angry.gif
godd
у меня и под Виндой блокируется (ME).
GoodWind
Цитата
у меня и под Виндой блокируется (ME).

надо-же blink.gif
Guest
я серьезно говорю. Винда - MilleniumEdition, Ctrl+Break - блокируется через checkbreak:=false модуля CRT (в help'e написано что он и под виндами пашет, и отключает не тока Ctrl+Break но и Alt+F4 и еще чо-то - кому интересно в справке), просто Break - останавливает прогу до нажатия клавиши
godd
пред пост я написал.
Altair
Цитата
я серьезно говорю. Винда - MilleniumEdition, Ctrl+Break - блокируется через checkbreak:=false модуля CRT (в help'e написано что он и под виндами пашет, и отключает не тока Ctrl+Break но и Alt+F4 и еще чо-то - кому интересно в справке), просто Break - останавливает прогу до нажатия клавиши

Это всем известно smile.gif
Цитата
просто Break - останавливает

Ничего он не останавливает!
Это останавливает клавиша PAUSE, просто они 2 клавиши сидят физически на одной, но при нажатии PAUSE и PAUSE (break) и еще какой-нибудь вырабатываютсяразные скан-коды. !
godd
Oleg_Z
я имел ввиду паузу.
BlackShadow
Не стал дочитывать до конца - влом как-то. Есть такой Int интересный, который вызывается как реакция на Ctrl+Break. Вроде 24h. Его адрес ещё в PSP прописывается. Можно было бы его перехватить... Хотя, что на это скажет винда - не знаю.
Altair
Ага, спасибо BlackShadow, именно мне это и надо!
перхват прерывания самое надежное дело!
godd
BlackShadow
а ты почитай, там вывод: checkbreak из модуля crt решает данную задачу
godd
Oleg_Z
дело хозяйское
Altair
Дело в том, что из модуля то решает но инстерсно как там все работает!
godd
Oleg_Z
понятно. просто я на ассме не разбираюсь, и не до конца понимаю, где он может пригодиться (ну мелкие там функции для прог - это и я, если поднапрячся и сильно надо будет смогу, а по-крупному?)
BlackShadow
godd, тогда и не пытайся учить старших smile.gif
CheckBreak определяет набор функций DOS'а, которые используются при вводе выводе самим модулем. А вот Oleg_Z, может относит себя к тем, что не станет рисковать Runtime Error'ом 200 из-за какого-то CheckBreak'а.
godd
BlackShadow
я и не пытаюсь ;)
мне просто интересно )
xds
Прерывание Int 23h активизируется из системных вызовов DOS, проверяющих буфер клавиатуры (в основном функции консольного ввода-вывода), и возникает при обнаружении в буфере сочетания Ctrl-C. При нажатии Ctrl-Break происходит более сложная комбинация: контроллер клавиатуры -> IRQ1 <=> Int 9 -> Int 1Bh - обработчик Ctrl-Break BIOS'а, по умолчанию вставляет Ctrl-C в буфер клавиатуры.

Вектор Int 23h не требует восстановления перед выходом из программы: после завершения программы DOS сама присваивает стандартные значения векторам Int 22h, 23h, 24h.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.