Fixed the EventHook() code so that it also works on Windows, sort of.
(The "sort of" is because it uses kbhit() to detect that the user
starts typing, and then no events are processed until they hit
return.)

Also fixed a nasty locking bug: EventHook() is called without the Tcl
lock set, so it can't use the ENTER_PYTHON and LEAVE_PYTHON macros,
which manipulate both the Python and the Tcl lock.  I now only acquire
and release the Python lock.

(Haven't tested this on Unix yet...)
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
index 1c2c793..70d571b 100644
--- a/Modules/_tkinter.c
+++ b/Modules/_tkinter.c
@@ -121,6 +121,11 @@
 
 #endif /* HAVE_CREATEFILEHANDLER */
 
+#ifdef MS_WINDOWS
+#include <conio.h>
+#define WAIT_FOR_STDIN
+#endif
+
 #ifdef WITH_THREAD
 
 /* The threading situation is complicated.  Tcl is not thread-safe, except for
@@ -1822,6 +1827,7 @@
 
 static int stdin_ready = 0;
 
+#ifndef MS_WINDOWS
 static void
 MyFileProc(clientData, mask)
 	void *clientData;
@@ -1829,22 +1835,34 @@
 {
 	stdin_ready = 1;
 }
+#endif
 
 static PyThreadState *event_tstate = NULL;
 
 static int
 EventHook()
 {
+#ifndef MS_WINDOWS
 	FHANDLE tfile;
-
-	ENTER_PYTHON(event_tstate)
-	tfile = MAKEFHANDLE(fileno(stdin));
+#endif
+	if (PyThreadState_Swap(NULL) != NULL)
+		Py_FatalError("EventHook with non-NULL tstate\n");
+	PyEval_RestoreThread(event_tstate);
 	stdin_ready = 0;
+	errorInCmd = 0;
+#ifndef MS_WINDOWS
+	tfile = MAKEFHANDLE(fileno(stdin));
 	Tcl_CreateFileHandler(tfile, TCL_READABLE, MyFileProc, NULL);
+#endif
 	while (!errorInCmd && !stdin_ready) {
 		int result;
-
-#ifdef WITH_THREAD
+#ifdef MS_WINDOWS
+		if (_kbhit()) {
+			stdin_ready = 1;
+			break;
+		}
+#endif
+#if defined(WITH_THREAD) || defined(MS_WINDOWS)
 		ENTER_TCL
 		result = Tcl_DoOneEvent(TCL_DONT_WAIT);
 		release_lock(tcl_lock);
@@ -1858,14 +1876,16 @@
 		if (result < 0)
 			break;
 	}
+#ifndef MS_WINDOWS
 	Tcl_DeleteFileHandler(tfile);
+#endif
 	if (errorInCmd) {
 		errorInCmd = 0;
 		PyErr_Restore(excInCmd, valInCmd, trbInCmd);
 		excInCmd = valInCmd = trbInCmd = NULL;
 		PyErr_Print();
 	}
-	LEAVE_PYTHON
+	PyEval_SaveThread();
 	return 0;
 }