Name: Anonymous 2009-03-13 20:23
is it possible?
getchu, if you catch my drift.
getch.def getch():
""" Read a character without actually pressing Enter. """
import sys
if sys.platform == 'win32':
# Enjoy your AIDS
import ctypes
# Set up functions, constants, etc
kernel32 = ctypes.windll.kernel32
HANDLE = ctypes.c_void_p
DWORD = ctypes.c_ulong
LPDWORD = ctypes.POINTER(ctypes.c_ulong)
LPVOID = ctypes.c_void_p
# GetStdHandle
STD_INPUT_HANDLE = ctypes.c_ulong(-10)
GetStdHandle = kernel32.GetStdHandle
GetStdHandle.argtypes = [DWORD]
GetStdHandle.restype = HANDLE
# GetConsoleMode
ENABLE_ECHO_INPUT = 0x4L
ENABLE_LINE_INPUT = 0x2L
GetConsoleMode = kernel32.GetConsoleMode
GetConsoleMode.argtypes = [HANDLE, LPDWORD]
GetConsoleMode.restype = bool
# SetConsoleMode
SetConsoleMode = kernel32.SetConsoleMode
SetConsoleMode.argtypes = [HANDLE, DWORD]
SetConsoleMode.restype = bool
# ReadConsole
ReadConsole = kernel32.ReadConsoleW
ReadConsole.argtypes = [HANDLE, LPVOID, DWORD, LPDWORD, LPVOID]
ReadConsole.restype = bool
# Get console handle
handle = GetStdHandle(STD_INPUT_HANDLE)
if long(handle) == -1L:
raise WindowsError, 'Unable to obtain STDIN handle'
# Store old mode
oldmode = DWORD()
success = GetConsoleMode(handle, ctypes.byref(oldmode))
if not success:
raise WindowsError, 'Unable to get console mode'
try:
# Change mode
newmode = oldmode.value & ~(ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT)
success = SetConsoleMode(handle, newmode)
if not success:
raise WindowsError, 'Unable to set console mode'
# Read input
buffer = ctypes.create_unicode_buffer('', 1)
chars_read = DWORD()
success = ReadConsole(handle, ctypes.byref(buffer), 1, ctypes.byref(chars_read), None)
if not success:
raise WindowsError, 'Console read failed'
finally:
SetConsoleMode(handle, oldmode)
return buffer.value
else:
import termios
oldflags = termios.tcgetattr(sys.stdin.fileno())
newflags = list(oldflags)
# Set non-canonical mode
newflags[3] &= ~(termios.ICANON | termios.ECHO)
try:
termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, newflags)
chars = sys.stdin.read(1)
finally:
termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, oldflags)
return chars.decode()
NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL.