跳转到内容

QBasic/高级输入

来自维基教科书,开放的书籍,为开放的世界

从用户获取实时信息有点困难。为此,我们将使用 INKEY$ 命令,该命令检查用户是否输入了键并向程序提供按键。

看看这段代码,然后我们将深入了解它

DO
	LET k$ = INKEY$
LOOP UNTIL k$ <> ""
SELECT CASE k$
	CASE "q"
		QuitProgram
	CASE "c"
		MakeCircle
	CASE "s"
		MakeSquare
END SELECT

第一部分是 DO-LOOP,它不断轮询 INKEY$ 以获取返回值。在基本使用中,INKEY$ 如果没有按下任何键,则返回一个空字符串并继续执行程序。一旦按下键,INKEY$ 将立即返回该键。

键盘缓冲区

[编辑 | 编辑源代码]

INKEY$ 在做什么,它是如何工作的?

虽然 INKEY$ 命令看起来像是在返回当前按下的键,但事实并非如此。它由程序用来回答“键盘缓冲区里有什么?”这个问题。要理解这一点,你需要了解基本缓冲区是什么以及为什么要使用它。

在旧系统(不一定是指 IBM PC)中,一个单一的芯片处理键盘输入,并控制 Caps Lock 和 Number Lock 的 LED 指示灯。由于计算机同时执行许多操作(例如,从鼠标获取输入、计算数据、调用子例程、在屏幕上显示新信息),因此它需要能够记住在忙碌时键盘上按了什么键。该芯片包含一些内存(称为缓冲区),可以用来跟踪有限数量的按键。

在 IBM PC 上的 Dos 平台下,硬件略有变化。不再是硬件缓冲区,而是按下或释放一个键会中断正在运行的程序,将一个击键添加到位于 BIOS 中的软件缓冲区。此过程通常用户不会注意到,对系统性能的影响也很小。但是,该缓冲区允许 15 个字符:尝试在计算机繁忙时溢出它会导致短暂的蜂鸣声并丢弃任何其他字符。

INKEY$ 命令将此缓冲区用作 FIFO(先进先出)缓冲区。例如,假设你有一个游戏,屏幕上有一个弹跳球,底部有一个球拍。计算机程序必须不断更新屏幕以显示球的运动。在执行此操作时,程序会经过 INKEY$ 命令以查看返回什么值。如果用户自上次调用命令以来按下了键,它将返回该键。假设球向右移动,用户需要按“R”键告诉程序向右移动球拍。由于程序忙于移动球并更新屏幕,因此它不会立即注意到用户按下了键。相反,按键会被存储在键盘缓冲区中,并在几毫秒(或微秒)后在使用 INKEY$ 命令时被检索。

在许多程序中(如上所述),INKEY$ 会出现在循环中。它被反复请求。这允许程序一次获取一个字符的用户输入。使用上面的例子,用户可能需要反复按下 R 键,直到球拍在球的下方。另一方面,用户可能按下了太多次 R,需要按下 L 键将其向左移动。由于 INKEY$ 命令使用的是 FIFO 缓冲区,因此它将始终按输入键的顺序检索它们。

总之,INKEY$ 命令将始终返回并删除键盘缓冲区中的第一个字符。通常,它被反复使用以检索所有已按下的键,并允许用户以接近“实时”的方式与程序交互。如果键盘缓冲区中没有键,INKEY$ 将返回一个空字符串(无字符)。

扫描码

[编辑 | 编辑源代码]

某些按键与 ASCII 字符无关。当按下这些键之一时,INKEY$ 会返回一个包含两个字符的字符串:第一个字符是空字符(ASCII 码 0),第二个字符是键盘的原始扫描码。QBASIC 帮助文件中包含了扫描码的完整列表。你也可以通过在按下这些键时检查 INKEY$ 的结果来确定扫描码。

注意
某些键无法被 INKEY$ 直接检测到。

  Ctrl+            Extended; prefixed with CHR$(0)
 1  A               3   Ctrl+2
 2  B              15   Shift+Tab
 3  C              
 4  D                Alt+    Alt+    Alt+     Alt+
 5  E              16  Q   30  A   44  Z   120  1
 6  F              17  W   31  S   45  X   121  2
 7  G              18  E   32  D   46  C   122  3
 8  H  Backspace   19  R   33  F   47  V   123  4
 9  I  Tab         20  T   34  G   48  B   124  5
10  J  Ctrl+Enter  21  Y   35  H   49  N   125  6
11  K              22  U   36  J   50  M   126  7
12  L              23  I   37  K           127  8
13  M  Enter       24  O   38  L           128  9
14  N              25  P                   129  0
15  O                                      130  -
16  P                 Shift Ctrl Alt       131  =
17  Q              59   84   94  104  F1
18  R              60   85   95  105  F2
19  S              61   86   96  106  F3
20  T              62   87   97  107  F4
21  U              63   88   98  108  F5
22  V              64   89   99  109  F6
23  W              65   90  100  110  F7
24  X              66   91  101  111  F8
25  Y              67   92  102  112  F9
26  Z              68   93  103  113  F10
27  [  Escape     133  135  137  139  F11
28  \             134  136  138  140  F12
29  ]
30  6              71  Home   72  Up    73  PgUp
31  -              75  Left             77  Right
                   79  End    80  Down  81  PgDn
   Ctrl+           82  Insert           83  Del
127 Backspace
                  119  Ctrl+Home   132  Ctrl+PgUp
                  115  Ctrl+Left   116  Ctrl+Right
                  117  Ctrl+End    118  Ctrl+PgDn
华夏公益教科书