控制台模式下的单字符输入有些复杂。MS-Windows 为当前安装的键盘提供了驱动器。当一个键被按下时,一个 8 位的扫描码 (scan code) 就被传递到计算机的键盘端口。当这个键被释放时,就会传递第二个扫描码。
MS-Windows 利用设备驱动程序将扫描码转换为 16 位的虚拟键码 (virtual-key code),即 MS-Windows 定义的用于标识按键用途的与设备无关数值。MS-Windows 生成含有扫描码、虚拟键码和其他信息的消息。这个消息放在 MS-Windows 消息队列中,并最终进入当前执行程序线程(由控制台输入句柄标识)。
如果想要进一步了解键盘输入过程,请参阅 Platform SDK 文档中的 About Keyboard Input 主题。虚拟键常数列表位于本教程 \Examples\chll 目录下的 VirtualKeys.inc 文件中。
Irvine32 键盘过程 Irvine32 链接库由两个相关过程:
如果 ReadKey 过程中的 AL 等于 0,那么用户可能按下了特殊键(功能键、光标箭头等)。AH 寄存器为键盘扫描码。DX 为虚拟键码,EBX 为键盘控制键状态信息。
下表为控制键值列表。调用 ReadKey 之后,可以用 TEST 指令检查各种键值。
值 | 含义 | 值 | 含义 |
---|---|---|---|
CAPSLOCK_ON | CAPSLOCK 指示灯亮 | RIGHT_ALT_PRESSED | 右 ALT 键被按下 |
ENHANCED_KEY | 被按下增强的 | RIGHT_CTRL_PRESSED | 右 CTRL 键被按下 |
LEFT_ALT_PRESSED | 该键是左 ALT 键 | SCROLLLOCL_ON | SCROLLLOCK 指示灯亮 |
LEFT_CTRL_PRESSED | 左 CTRL 键被按下 | SHIFT_PRESSED | SHIFT 键被按下 |
NUMLOCK_ON | NUMLOCK 指示灯亮 |
下面是 ReadKey 测试程序:等待一个按键,然后报告按下的是否为 CapsLock 键。程序应考虑延迟因素,以便在调用 ReadKey 时留出时间让 MS-Windows 处理其消息循环:
; 测试 ReadKey ( TestReadkey. asm)
INCLUDE Irvine32.inc
INCLUDE Macros.inc
.code
main PROC
L1: mov eax,10 ; 消息处理带来的延迟
call Delay
call ReadKey ; 等待按键
jz L1
test ebx,CAPSLOCK_ON
jz L2
mWrite <"CapsLock is ON",0dh,0ah>
jmp L3
L2: mWrite <"CapsLock is OFF",0dh,0ah>
L3: exit
main ENDP
END main