控制檯模式下的單字符輸入有些複雜。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 連接庫由兩個相關過程:
ide
ReadChar:等待鍵盤輸入一個 ASCII 字符,並用 AL 返回該字符。測試
ReadKey:過程執行無等待鍵盤檢查。若是控制檯輸入緩衝區中沒有等待的按鍵,則零標誌位置 1。若是發現有按鍵,則零標誌位清零且 AL 等於零或 ASCII 碼。EAX 和 EDX 的高 16 位被覆蓋。spa
若是 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 測試程序
下面是 ReadKey 測試程序:等待一個按鍵,而後報告按下的是否爲 CapsLock 鍵。程序應考慮延遲因素,以便在調用 ReadKey 時留出時間讓 MS-Windows 處理其消息循環:
code
; 測試 ReadKey ( TestReadkey. asm)INCLUDE Irvine32.incINCLUDE Macros.inc.codemain PROCL1: mov eax,10 ; 消息處理帶來的延遲 call Delay call ReadKey ; 等待按鍵 jz L1 test ebx,CAPSLOCK_ON jz L2 mWrite <"CapsLock is ON",0dh,0ah> jmp L3L2: mWrite <"CapsLock is OFF",0dh,0ah>L3: exitmain ENDPEND main