123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- 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()
|