C语言控制台窗口图形界面编程之七 键盘事件2015-01-16输入事件中的键盘事件通常有字符事件和按键事件,这些事件的附带信息构成了键盘输入的信息,而想要读取这些信息,是要通过API函数ReadConsoleInput来获取的,函数原型如下:
BOOL ReadConsoleInput(//读取输入信息HANDLE hConsoleInput, //句柄PINPUT_RECORD lpBuffer, //输入事件结构体的指针DWORD nLength,//要读取的记录数LPDWORD lpNumberOfEventsRead//用来接受成功读取记录数的指针);//如果该函数成功调用,返回非零值//输入事件结构体的指针可以是结构体数组的首地址,这样就可以一次性读取多个记录数。
下面介绍几个和读取键盘输入事件有关的结构体,各结构体原型如下:
typedef struct _INPUT_RECORD//输入事件结构体{WORDEventType;//事件类型union{KEY_EVENT_RECORDKeyEvent; //按键事件MOUSE_EVENT_RECORDMouseEvent; //鼠标事件WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;MENU_EVENT_RECORD MenuEvent;FOCUS_EVENT_RECORDFocusEvent;} Event;//具体的事件} INPUT_RECORD;/* 其中事件类型EventType的值有5种 KEY_EVENT 代表Event包含一个KEY_EVENT_RECODE结构体 MOUSE_EVENT 代表Event包含一个MOUSE_EVENT_RECODE结构体 WINDOW_BUFFER_SIZE_EVENT代表Event包含一个WINDOW_BUFFER_SIZE_EVENT_RECORD结构体 MENU_EVENT代表Event包含一个MENU_EVENT_RECORD结构体 FOCUS_EVENT 代表Event包含一个FOCUS_EVENT_RECORD结构体 */typedef struct _KEY_EVENT_RECORD//键盘事件结构体 {BOOLbKeyDown; //按键状态,true代表键按下,false代表键释放WORDwRepeatCount; //按键次数WORDwVirtualKeyCode;//虚拟键WORDwVirtualScanCode; //虚拟键扫描码union{WCHAR UnicodeChar;//解释成Unicode宽字符CHARAsciiChar;//解释成ASCII码字符} uChar;DWORD dwControlKeyState;//控制键状态} KEY_EVENT_RECORD;/* 控制键各状态的值 ENHANCED_KEY扩展键被按下 LEFT_ALT_PRESSED左Alt键被按下 LEFT_CTRL_PRESSED 左Ctrl键被按下 RIGHT_ALT_PRESSED 右Alt键被按下 RIGHT_CTRL_PRESSED右Ctrl键被按下 NUMLOCK_ON数字锁定被打开 SCROLLLOCK_ON 滚动锁定被打开 CAPSLOCK_ON 大写锁定被打开 SHIFT_PRESSED Shift键被按下 */
当输入事件为键盘事件时,事件类型就为键盘事件,为其他事件时,事件类型就为对应的事件。另外,键盘上每个有意义的键都对应着一个唯一的扫描码,虽然扫描码可以作为键的标识,但是它是依赖于具体的设备的。因此,在应用程序中,使用的往往是与具体设备无关的虚拟键代码。这种虚拟键代码是一种与具体设备无关的键盘编码。而控制键状态比如大写锁定开启状态,Ctrl键按下状态等、、、下面是部分常用虚拟键代码表:
/* 虚拟键代码值键名称 ----------------------------------------------------- VK_BACK 0x08退格键 VK_TAB0x09Tab键 VK_RETURN 0x0D回车键 VK_SHIFT0x10Shift键 VK_LSHIFT 0xA0左Shift键 VK_RSHIFT 0xA1右Shift键 VK_CONTROL0x11Ctrl键 VK_LCONTROL 0xA2左Ctrl键 VK_RCONTROL 0xA3右Ctrl键 VK_MENU 0x12Alt键 VK_LMENU0xA4左Alt键 VK_RMENU0xA5右Alt键 VK_PAUSE0x13Pause键 VK_CAPITAL0x14Caps Lock键 VK_NUMLOCK0x90Num Lock键 VK_SCROLL 0x91Scroll Lock键 VK_ESCAPE 0x1BEsc键 VK_SPACE0x20空格键 VK_PRIOR0x21Page Up键 VK_NEXT 0x22Page Down键 VK_END0x23End键 VK_HOME 0x24Home键 VK_LEFT 0x25左方向键 VK_UP 0x26上方向键 VK_RIGHT0x27右方向键 VK_DOWN 0x28下方向键 VK_DELETE 0x2EDelete键 VK_INSERT 0x2DInsert键 "0" 0x300键(非小键盘) "1" 0x311键(非小键盘) "2" 0x322键(非小键盘) ... ... ... "9" 0x399键(非小键盘) "A" 0x41A键 "B" 0x42B键 ... ... ... "Z" 0x5AZ键 VK_SLEEP0x5FSleep键 VK_NUMPAD00x60小键盘0键 VK_NUMPAD10x61小键盘1键 VK_NUMPAD20x62小键盘2键 ... ... ... VK_NUMPAD90x69小键盘9键 VK_MULTIPLY 0x6A小键盘乘键* VK_ADD0x6B小键盘加键+ VK_SUBTRACT 0x6D小键盘减键- VK_DIVIDE 0x6F小键盘除键/ VK_DECIMAL0x6E小键盘点键. VK_F1 0x70F1键 VK_F2 0x71F2键 ... ... ... VK_F120x7BF12键 VK_F130x7CF13键注:别问我,我也不知道什么电脑有这么多键 ... ... ... VK_F240x87F24键 VK_OEM_10xBA;:键 VK_OEM_20xBF/?键 VK_OEM_30xC0·~键 VK_OEM_40xDB[{键 VK_OEM_50xDC|键 VK_OEM_60xDD]}键 VK_OEM_70xDE""键 VK_OEM_PLUS 0xBB=+键 VK_OEM_MINUS0xBD-_键 VK_OEM_COMMA0xBC,<键 VK_OEM_PERIOD 0xBE.>键*/
以上是部分常用的微软虚拟键盘码表,想要知道更详细的,请参见MSDN。其中各个虚拟键的具体使用情况根据各人编译器或IDE等的不同而有所差异。下面是一个实现按Esc键就输出Esc的样例程序: