diff --git a/src/lib.rs b/src/lib.rs
index 505660cc06dc91e0ff6cafd77f4873219c8b93cd..6d4c04f276d6c8d3ebe0a140cf29b36b985a8a02 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -331,9 +331,15 @@ fn enable_raw_mode() -> Result<Mode> {
 fn enable_raw_mode() -> Result<Mode> {
     let handle = try!(get_std_handle(STDIN_FILENO));
     let original_mode = try!(get_console_mode(handle));
+    // Disable these modes
     let raw = original_mode &
               !(winapi::wincon::ENABLE_LINE_INPUT | winapi::wincon::ENABLE_ECHO_INPUT |
                 winapi::wincon::ENABLE_PROCESSED_INPUT);
+    // Enable these modes
+    let raw = raw | winapi::wincon::ENABLE_EXTENDED_FLAGS;
+    let raw = raw | winapi::wincon::ENABLE_INSERT_MODE;
+    let raw = raw | winapi::wincon::ENABLE_QUICK_EDIT_MODE;
+    let raw = raw | winapi::wincon::ENABLE_WINDOW_INPUT;
     check!(kernel32::SetConsoleMode(handle, raw));
     Ok(original_mode)
 }
@@ -990,12 +996,10 @@ impl<R: Read> RawReader<R> {
                 continue;
             }
 
-            /*let ctrl = key_event.dwControlKeyState &
-                       (winapi::LEFT_CTRL_PRESSED | winapi::RIGHT_CTRL_PRESSED) !=
-                       0;*/
-            let meta = (key_event.dwControlKeyState &
-                        (winapi::LEFT_ALT_PRESSED | winapi::RIGHT_ALT_PRESSED) !=
-                        0) || esc_seen;
+            let alt_gr = key_event.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_ALT_PRESSED) == (LEFT_CTRL_PRESSED | RIGHT_ALT_PRESSED);
+            let alt = key_event.dwControlKeyState & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED) == (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED);
+            let ctrl = key_event.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED) == (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED);
+            let meta = alt || esc_seen;
 
             let utf16 = key_event.UnicodeChar;
             if utf16 == 0 {