#qb64
#qb64
Вопрос:
Я использовал следующий код для захвата контрольного разрыва, но ничего не получаю взамен:
Прерывание управления во время выполнения программы приводит к следующему:
1)Invokes interrupt trap 1Bh
2)Places 00:00 into keyboard buffer
3)Sets flag 80h at memory 40:71h
Пример обнаружения разрыва управления (скомпилированный):
DO
X$=INKEY$
IF X$=CHR$(0) CHR$(0) THEN
PRINT "*break*"
END
END IF
LOOP
Другой пример обнаружения разрыва управления (скомпилированный):
DEF SEG = amp;H40
POKE amp;H71, 0
DEF SEG
DO
DEF SEG = amp;H40
X = PEEK(amp;H71)
DEF SEG
IF X = 128 THEN
PRINT "*break*"
END
END IF
LOOP
Есть ли что-то, чего мне не хватает?
Комментарии:
1. Вы запрашиваете <ctrl><break> или <ctrl><C>? С QB64 в современных системах лучше не использовать PEEK и POKE.
2. Я перехватываю ctrl-break. Я могу легко перехватить ctrl-c как keyscan ascii 3.
Ответ №1:
Я написал приведенный ниже код (QB64), который перехватывает нажатие клавиши и отпускание клавиши.
В моей ОС Linux эта программа запускается, но она не перехватывает нажатие клавиши или отпускание клавиши break.
Я не знаю, связано ли указанное поведение с моей ОС, конфигурацией ОС или моей клавиатурой (Logitech wireless). Я думаю, это связано с поведением функции _KEYHIT
QB64.
PRINT "Hit Esc to exit"
DO
_LIMIT 20
xamp; = _KEYHIT
IF xamp; <> x1amp; THEN
IF xamp; < 0 THEN
PRINT "-"; HEX$(-xamp;)
ELSE
PRINT " "; HEX$(xamp;); " [";
yamp; = xamp;
WHILE yamp; > 256
PRINT CHR$(yamp; MOD 256); "] [";
yamp; = yamp; 256
WEND
PRINT CHR$(yamp;); "]"
END IF
x1amp; = xamp;
END IF
IF x = 27 THEN EXIT DO
LOOP
PRINT "Escape pressed."
Комментарии:
1. Это верно, потому что ctrl-break является аппаратной строкой, а _keyhit — нет.
2. _keyhit захватывает множество клавиш, а также shift, ctrl и alt. У меня есть код на C, который считывает все нажатия клавиш, но это код, который выполняется от имени root, я использовал его, чтобы проверить, распознает ли моя система ключ взлома!
Ответ №2:
Я нашел следующий код для захвата ctrl-break в qb64:
ON TIMER(1) GOSUB breaktrap
TIMER ON
x = _EXIT ' disable break
DO
_LIMIT 50
x$ = INKEY$
LOOP
breaktrap:
v = _EXIT
IF v THEN
PRINT "*break*"
SLEEP 5
SYSTEM
END IF
RETURN
Комментарии:
1. В моем дистрибутиве Kali-Linux этот код не перехватывает ни ctrl-c, ни ctrl-break. В консольном режиме ctrl-c завершает выполнение кода!
2. Это странно — в Win10 этот код ловит ctrl-break, но не ctrl-c..
3. ctrl-c в неконсольном режиме захвачен inkey$ . Я видел, что приведенный выше код в Linux в неконсольном режиме перехватывается как прерывание щелчка по значку закрытия Windows в правом верхнем углу окна.
4. Хм, окно x-close может вызвать ctrl-break !?
5. Я не думаю, что x-close вызывает ctrl-break, я думаю, что это код QB64, который захватывает x-close таким же образом, как ctrl-break!