ReadConsoleInput功能可用于直接访问控制台的输入缓冲区。当创建控制台时,鼠标输入被启用,窗口输入被禁用。为了确保进程接收所有类型的事件,本示例使用SetConsoleMode功能来启用窗口和鼠标输入。然后,它进入一个读取和处理控制台输入事件的循环。
VOID MouseEventProc(MOUSE_EVENT_RECORD);
VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD);
VOID KeyEventProc(KEY_EVENT_RECORD);
VOID GetInputEvents(VOID);
DWORD主(VOID){
HANDLE hStdin;
DWORD cNumRead, fdwMode, fdwSaveOldMode, i;
INPUT_RECORD irInBuf[128];
/ *获取标准输入句柄。*/
hStdin = GetStdHandle(STD_INPUT_HANDLE);
if (hStdin == INVALID_HANDLE_VALUE)
MyErrorExit("GetStdHandle");
/ *保存当前输入模式,退出时恢复。*/
if(!GetConsoleMode(hStdin,& fdwSaveOldMode))
MyErrorExit("GetConsoleMode");
/ *启用窗口和鼠标输入事件。*/
fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
if(!SetConsoleMode(hStdin,fdwMode))
MyErrorExit("SetConsoleMode");
/ *循环读取和处理输入事件。*/
而(1){
/ *等待事件。*/
如果(!读控制台输入(da
hStdin,/ *输入缓冲区句柄* /
irInBuf,/ *缓冲区读入* /
128,/ *读缓冲区大小* /
& cNumRead))/ *记录数*
MyErrorExit("ReadConsoleInput");
/ *将事件发送到相应的处理程序。*/
for (i = 0; i < cNumRead; i++)
switch(irInBuf [i] .EventType){
case KEY_EVENT: /* keyboard input */
KeyEventProc(irInBuf[i].Event.KeyEvent);
break;
case MOUSE_EVENT: /* mouse input */
MouseEventProc(irInBuf[i].Event.MouseEvent);
break;
case WINDOW_BUFFER_SIZE_EVENT: /* scrn buf. resizing */
ResizeEventProc(
irInBuf[i].Event.WindowBufferSizeEvent);
break;
case FOCUS_EVENT: /* disregard focus events */
case MENU_EVENT: /* disregard menu events */
break;
默认:
MyErrorExit("unknown event type");
break;
}
}
return 0;
}