diff --git a/configure b/configure
index 0752d73302803b856cabb63bb5b8774c0ba2591e..10269db2f09d0fe72fd3e57418aa418ed315c1d6 100755
--- a/configure
+++ b/configure
@@ -1101,6 +1101,7 @@ HAVE_LIST="
     memalign
     mkstemp
     mmap
+    PeekNamedPipe
     posix_memalign
     round
     roundf
@@ -2842,6 +2843,7 @@ check_func  strerror_r
 check_func  strptime
 check_func  strtok_r
 check_func_headers conio.h kbhit
+check_func_headers windows.h PeekNamedPipe
 check_func_headers io.h setmode
 check_func_headers lzo/lzo1x.h lzo1x_999_compress
 check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
diff --git a/ffmpeg.c b/ffmpeg.c
index 96515c0bcc60a0202e32e07b38e715fd191e8855..8b9cf1c1ac579c162dd24805ae68bbff3d01847d 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -487,9 +487,9 @@ static void term_init(void)
 /* read a key without blocking */
 static int read_key(void)
 {
+    unsigned char ch;
 #if HAVE_TERMIOS_H
     int n = 1;
-    unsigned char ch;
     struct timeval tv;
     fd_set rfds;
 
@@ -509,6 +509,32 @@ static int read_key(void)
         return n;
     }
 #elif HAVE_KBHIT
+#    if HAVE_PEEKNAMEDPIPE
+    static int is_pipe;
+    static HANDLE input_handle;
+    DWORD dw, nchars;
+    if(!input_handle){
+        input_handle = GetStdHandle(STD_INPUT_HANDLE);
+        is_pipe = !GetConsoleMode(input_handle, &dw);
+    }
+
+    if (stdin->_cnt > 0) {
+        read(0, &ch, 1);
+        return ch;
+    }
+    if (is_pipe) {
+        /* When running under a GUI, you will end here. */
+        if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
+            return -1;
+        //Read it
+        if(nchars != 0) {
+            read(0, &ch, 1);
+            return ch;
+        }else{
+            return -1;
+        }
+    }
+#    endif
     if(kbhit())
         return(getch());
 #endif