Контрольный разрыв в QB64

#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!