104 lines
4.5 KiB
Python
104 lines
4.5 KiB
Python
|
import win32console, win32con
|
||
|
import traceback, time
|
||
|
|
||
|
virtual_keys={}
|
||
|
for k,v in list(win32con.__dict__.items()):
|
||
|
if k.startswith('VK_'):
|
||
|
virtual_keys[v]=k
|
||
|
|
||
|
free_console=True
|
||
|
try:
|
||
|
win32console.AllocConsole()
|
||
|
except win32console.error as exc:
|
||
|
if exc.winerror!=5:
|
||
|
raise
|
||
|
## only free console if one was created successfully
|
||
|
free_console=False
|
||
|
|
||
|
stdout=win32console.GetStdHandle(win32console.STD_OUTPUT_HANDLE)
|
||
|
stdin=win32console.GetStdHandle(win32console.STD_INPUT_HANDLE)
|
||
|
newbuffer=win32console.CreateConsoleScreenBuffer()
|
||
|
newbuffer.SetConsoleActiveScreenBuffer()
|
||
|
newbuffer.SetConsoleTextAttribute(win32console.FOREGROUND_RED|win32console.FOREGROUND_INTENSITY
|
||
|
|win32console.BACKGROUND_GREEN|win32console.BACKGROUND_INTENSITY)
|
||
|
newbuffer.WriteConsole('This is a new screen buffer\n')
|
||
|
|
||
|
## test setting screen buffer and window size
|
||
|
## screen buffer size cannot be smaller than window size
|
||
|
window_size=newbuffer.GetConsoleScreenBufferInfo()['Window']
|
||
|
coord=win32console.PyCOORDType(X=window_size.Right+20, Y=window_size.Bottom+20)
|
||
|
newbuffer.SetConsoleScreenBufferSize(coord)
|
||
|
|
||
|
window_size.Right+=10
|
||
|
window_size.Bottom+=10
|
||
|
newbuffer.SetConsoleWindowInfo(Absolute=True,ConsoleWindow=window_size)
|
||
|
|
||
|
## write some records to the input queue
|
||
|
x=win32console.PyINPUT_RECORDType(win32console.KEY_EVENT)
|
||
|
x.Char='X'
|
||
|
x.KeyDown=True
|
||
|
x.RepeatCount=1
|
||
|
x.VirtualKeyCode=0x58
|
||
|
x.ControlKeyState=win32con.SHIFT_PRESSED
|
||
|
|
||
|
z=win32console.PyINPUT_RECORDType(win32console.KEY_EVENT)
|
||
|
z.Char='Z'
|
||
|
z.KeyDown=True
|
||
|
z.RepeatCount=1
|
||
|
z.VirtualKeyCode=0x5a
|
||
|
z.ControlKeyState=win32con.SHIFT_PRESSED
|
||
|
|
||
|
stdin.WriteConsoleInput([x,z,x])
|
||
|
|
||
|
newbuffer.SetConsoleTextAttribute(win32console.FOREGROUND_RED|win32console.FOREGROUND_INTENSITY
|
||
|
|win32console.BACKGROUND_GREEN|win32console.BACKGROUND_INTENSITY)
|
||
|
newbuffer.WriteConsole('Press some keys, click some characters with the mouse\n')
|
||
|
|
||
|
newbuffer.SetConsoleTextAttribute(win32console.FOREGROUND_BLUE|win32console.FOREGROUND_INTENSITY
|
||
|
|win32console.BACKGROUND_RED|win32console.BACKGROUND_INTENSITY)
|
||
|
newbuffer.WriteConsole('Hit "End" key to quit\n')
|
||
|
|
||
|
breakout=False
|
||
|
while not breakout:
|
||
|
input_records=stdin.ReadConsoleInput(10)
|
||
|
for input_record in input_records:
|
||
|
if input_record.EventType==win32console.KEY_EVENT:
|
||
|
if input_record.KeyDown:
|
||
|
if input_record.Char=='\0':
|
||
|
newbuffer.WriteConsole(virtual_keys.get(input_record.VirtualKeyCode, 'VirtualKeyCode: %s' %input_record.VirtualKeyCode))
|
||
|
else:
|
||
|
newbuffer.WriteConsole(input_record.Char)
|
||
|
if input_record.VirtualKeyCode==win32con.VK_END:
|
||
|
breakout=True
|
||
|
break
|
||
|
elif input_record.EventType==win32console.MOUSE_EVENT:
|
||
|
if input_record.EventFlags==0: ## 0 indicates a button event
|
||
|
if input_record.ButtonState!=0: ## exclude button releases
|
||
|
pos=input_record.MousePosition
|
||
|
# switch the foreground and background colors of the character that was clicked
|
||
|
attr=newbuffer.ReadConsoleOutputAttribute(Length=1, ReadCoord=pos)[0]
|
||
|
new_attr=attr
|
||
|
if attr&win32console.FOREGROUND_BLUE:
|
||
|
new_attr=(new_attr&~win32console.FOREGROUND_BLUE)|win32console.BACKGROUND_BLUE
|
||
|
if attr&win32console.FOREGROUND_RED:
|
||
|
new_attr=(new_attr&~win32console.FOREGROUND_RED)|win32console.BACKGROUND_RED
|
||
|
if attr&win32console.FOREGROUND_GREEN:
|
||
|
new_attr=(new_attr&~win32console.FOREGROUND_GREEN)|win32console.BACKGROUND_GREEN
|
||
|
|
||
|
if attr&win32console.BACKGROUND_BLUE:
|
||
|
new_attr=(new_attr&~win32console.BACKGROUND_BLUE)|win32console.FOREGROUND_BLUE
|
||
|
if attr&win32console.BACKGROUND_RED:
|
||
|
new_attr=(new_attr&~win32console.BACKGROUND_RED)|win32console.FOREGROUND_RED
|
||
|
if attr&win32console.BACKGROUND_GREEN:
|
||
|
new_attr=(new_attr&~win32console.BACKGROUND_GREEN)|win32console.FOREGROUND_GREEN
|
||
|
newbuffer.WriteConsoleOutputAttribute((new_attr,),pos)
|
||
|
else:
|
||
|
newbuffer.WriteConsole(str(input_record))
|
||
|
time.sleep(0.1)
|
||
|
|
||
|
stdout.SetConsoleActiveScreenBuffer()
|
||
|
newbuffer.Close()
|
||
|
if free_console:
|
||
|
win32console.FreeConsole()
|
||
|
|