【问题标题】:Control-Break in QB64QB64 中的控制中断
【发布时间】:2020-12-09 07:08:54
【问题描述】:

我一直在使用以下代码来捕获控制中断,但我没有得到任何回报:

程序执行期间的Control-Break 会导致以下情况发生:

1)Invokes interrupt trap 1Bh
2)Places 00:00 into keyboard buffer
3)Sets flag 80h at memory 40:71h

检测 Control-Break 的示例(已编译):

DO
   X$=INKEY$
   IF X$=CHR$(0)+CHR$(0) THEN
      PRINT "*break*"
      END
   END IF
LOOP

检测 Control-Break 的另一个示例(已编译):

DEF SEG = &H40
POKE &H71, 0
DEF SEG
DO
   DEF SEG = &H40
   X = PEEK(&H71)
   DEF SEG
   IF X = 128 THEN
      PRINT "*break*"
      END
   END IF
LOOP

我有什么遗漏吗?

【问题讨论】:

  • 您要的是 还是 ?在现代系统上使用 QB64 最好不要使用 PEEK 和 POKE。
  • 我正在捕获 ctrl-break。我可以轻松地将 ctrl-c 捕获为 keyscan ascii 3。

标签: qb64


【解决方案1】:

我已经编写了下面的代码 (QB64) 来拦截按键和按键释放。

在我的 Linux 操作系统上,该程序运行,但它不会拦截按键或中断键的按键释放。

我不知道上述行为是由我的操作系统、操作系统配置还是我的键盘(罗技无线)引起的。我认为这是由于 QB64 函数 _KEYHIT 的行为。

PRINT "Hit Esc to exit"
DO
  _LIMIT 20
  x& = _KEYHIT

  IF x& <> x1& THEN
    IF x& < 0 THEN
      PRINT "-"; HEX$(-x&)
    ELSE
      PRINT "+"; HEX$(x&); " [";
      y& = x&
      WHILE y& > 256
        PRINT CHR$(y& MOD 256); "] [";
        y& = y& \ 256
      WEND
      PRINT CHR$(y&); "]"
    END IF
    x1& = x&
  END IF

  IF x = 27 THEN EXIT DO
LOOP
PRINT "Escape pressed."

【讨论】:

  • 这是真的,因为 ctrl-break 是硬件线路,而 _keyhit 不是。
  • _keyhit 捕获了很多键,还包括 shift、ctrl 和 alt。我有一个读取所有按键的 C 代码,但它是以 root 身份运行的代码,我用它来验证我的系统是否正在识别中断键!
【解决方案2】:

我发现以下代码可以在 qb64 中捕获 ctrl-break:

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

【讨论】:

  • 在我的 Kali-Linux 发行版上,这段代码不会拦截 ctrl-c 和 ctrl-break。在控制台模式下 ctrl-c 终止代码的执行!
  • 这很奇怪 - 在 Win10 中,此代码捕获 ctrl-break 但不是 ctrl-c..
  • 非控制台模式下的 ctrl-c 被 inkey$ 捕获。我已经看到上面的代码在 linux 上,在非控制台模式下,拦截窗口右上角的关闭窗口图标。
  • 嗯,x-close 窗口可能会调用 ctrl-break!?
  • 我不认为 x-close 调用 ctrl-break,我认为这是 QB64 代码以与 ctrl-break 相同的方式捕获 x-close!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
相关资源
最近更新 更多