The ReadConsoleInput function can be used to directly access a console's input buffer. When a console is created, mouse input is enabled and window input is disabled. To ensure that the process receives all types of events, this example uses the SetConsoleMode function to enable window and mouse input. Then it goes into a loop that reads and handles console input events.
VOID MouseEventProc(MOUSE_EVENT_RECORD);
VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD);
VOID KeyEventProc(KEY_EVENT_RECORD);
VOID GetInputEvents(VOID);
DWORD main(VOID) {
HANDLE hStdin;
DWORD cNumRead, fdwMode, fdwSaveOldMode, i;
INPUT_RECORD irInBuf[128];
/* Get the standard input handle. */
hStdin = GetStdHandle(STD_INPUT_HANDLE);
if (hStdin == INVALID_HANDLE_VALUE)
MyErrorExit("GetStdHandle");
/* Save the current input mode, to be restored on exit. */
if (! GetConsoleMode(hStdin, &fdwSaveOldMode) )
MyErrorExit("GetConsoleMode");
/* Enable the window and mouse input events. */
fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT;
if (! SetConsoleMode(hStdin, fdwMode) )
MyErrorExit("SetConsoleMode");
/* Loop to read and handle the input events. */
while (1) {
/* Wait for the events. */
if (! ReadConsoleInput(
hStdin, /* input buffer handle */
irInBuf, /* buffer to read into */
128, /* size of read buffer */
&cNumRead) ) /* number of records read */
MyErrorExit("ReadConsoleInput");
/* Dispatch the events to the appropriate handler. */
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;
default:
MyErrorExit("unknown event type");
break;
}
}
return 0;
}