public ConsoleKeyInfo ReadKey (bool intercept)
{
int eventsRead;
InputRecord record = new InputRecord ();
do {
if (!ReadConsoleInput (inputHandle, out record, 1, out eventsRead))
throw new InvalidOperationException ("Error in ReadConsoleInput " +
Marshal.GetLastWin32Error ());
} while (record.EventType != 1 && !record.KeyDown);
// RIGHT_ALT_PRESSED 1
// LEFT_ALT_PRESSED 2
// RIGHT_CTRL_PRESSED 4
// LEFT_CTRL_PRESSED 8
// SHIFT_PRESSED 16
bool alt = ((record.ControlKeyState & 3) != 0);
bool ctrl = ((record.ControlKeyState & 12) != 0);
bool shift = ((record.ControlKeyState & 16) != 0);
return new ConsoleKeyInfo (record.Character, (ConsoleKey) record.VirtualKeyCode, shift, alt, ctrl);
}