def _inject_mouse(screen, x, y, button): """ Inject a mouse event into the input buffers. """ if sys.platform == "win32": event = win32console.PyINPUT_RECORDType(win32console.MOUSE_EVENT) event.MousePosition.X = x event.MousePosition.Y = y if button & MouseEvent.LEFT_CLICK != 0: event.ButtonState |= win32con.FROM_LEFT_1ST_BUTTON_PRESSED if button & MouseEvent.RIGHT_CLICK != 0: event.ButtonState |= win32con.RIGHTMOST_BUTTON_PRESSED if button & MouseEvent.DOUBLE_CLICK != 0: event.EventFlags |= win32con.DOUBLE_CLICK screen._stdin.WriteConsoleInput([event]) else: # Curses doesn't like no value in some cases - use a dummy button # click which we don't use instead. bstate = curses.BUTTON4_CLICKED if button & MouseEvent.LEFT_CLICK != 0: bstate |= curses.BUTTON1_CLICKED if button & MouseEvent.RIGHT_CLICK != 0: bstate |= curses.BUTTON3_CLICKED if button & MouseEvent.DOUBLE_CLICK != 0: bstate |= curses.BUTTON1_DOUBLE_CLICKED curses.ungetmouse(0, x, y, 0, bstate)
def internal_checks(screen): # Not much we can do here as refresh will draw to a screen we can't # query. Check that we don't hit an Exception on refresh(). if sys.platform == "win32": # Strictly speaking, this doesn't test catching ctrl-c as # it isn't possible to trigger the control handler (even if # we don't catch interrupts). Still a good basic check for # input, though. event = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) event.Char = u"\03" event.KeyDown = 1 event.RepeatCount = 1 event.ControlKeyState = win32con.LEFT_CTRL_PRESSED event.VirtualKeyCode = 67 event.VirtualScanCode = 46 screen._stdin.WriteConsoleInput([event]) event.KeyDown = 0 screen._stdin.WriteConsoleInput([event]) ch = screen.get_event() self.assertEqual(ch.key_code, 3) self.assertIsNone(screen.get_event()) else: # Check Ctrl-c (and no other input) os.kill(os.getpid(), signal.SIGINT) ch = screen.get_event() self.assertEqual(ch.key_code, 3) self.assertIsNone(screen.get_event()) # Check Ctrl-z (and no other input) os.kill(os.getpid(), signal.SIGTSTP) ch = screen.get_event() self.assertEqual(ch.key_code, 26) self.assertIsNone(screen.get_event())
def _inject_key(screen, char): """ Inject a specified character into the input buffers. """ if sys.platform == "win32": event = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) event.RepeatCount = 1 event.ControlKeyState = 0 event.VirtualScanCode = 0 if char >= 0: event.Char = chr(char) event.VirtualKeyCode = ord(chr(char).upper()) else: # Lookup in mapping dicts reverse = dict( (v, k) for k, v in screen._EXTRA_KEY_MAP.items()) if char in reverse: event.VirtualKeyCode = reverse[char] else: # Fudge key state required for BACK_TAB if needed. if char == Screen.KEY_BACK_TAB: char = Screen.KEY_TAB event.ControlKeyState = win32con.SHIFT_PRESSED reverse = dict((v, k) for k, v in screen._KEY_MAP.items()) event.VirtualKeyCode = reverse[char] event.KeyDown = 1 screen._stdin.WriteConsoleInput([event]) event.KeyDown = 0 screen._stdin.WriteConsoleInput([event]) else: curses.ungetch(char)
def generate_windows_keypress(character): """ Generate an 'Enter' keypress to terminate Windows training """ buf = win32console.PyINPUT_RECORDType( # pylint:disable=c-extension-no-member win32console.KEY_EVENT) # pylint:disable=c-extension-no-member buf.KeyDown = 1 buf.RepeatCount = 1 buf.Char = character return buf
def createKeyEvent(self, char): """Creates a single key record corrosponding to the ascii character char.""" evt = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) evt.KeyDown = True evt.Char = char evt.RepeatCount = 1 return evt
def sendkeys(string=""): keys = [] for c in str(string): evt = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) evt.Char = c evt.RepeatCount = 1 evt.KeyDown = True keys.append(evt) _stdin.WriteConsoleInput(keys)
def rlinput(prompt, prefill=''): keys = [] for c in prefill: evt = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) evt.Char = c evt.RepeatCount = 1 evt.KeyDown = True keys.append(evt) _stdin.WriteConsoleInput(keys) return input(prompt)
def input_def(prompt, default='Hola'): keys = [] for c in unicode(default): evt = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) evt.Char = c evt.RepeatCount = 1 evt.KeyDown = True keys.append(evt) _stdin.WriteConsoleInput(keys) return raw_input(prompt)
def make_input_key(c, control_key_state=None): input_key = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) try: input_key.Char = unicode(c) except: input_key.Char = unicode(' ') input_key.VirtualKeyCode = user32.VkKeyScanA(ord(c)) input_key.KeyDown = True input_key.RepeatCount = 1 if control_key_state: input_key.ControlKeyState = control_key_state return input_key
def __call__(self, prompt, prefill=''): import win32console _stdin = win32console.GetStdHandle(win32console.STD_INPUT_HANDLE) keys = [] for c in str(prefill): evt = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) evt.Char = c evt.RepeatCount = 1 evt.KeyDown = True keys.append(evt) _stdin.WriteConsoleInput(keys) return input(prompt)
def status(self): if not self.session_status in ["Paused", "Running"]: return if os.name == 'nt': evt = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) evt.Char = 's' evt.RepeatCount = 1 evt.KeyDown = True evt.VirtualKeyCode=0x0 self.win_stdin.WriteConsoleInput([evt]) else: try: self.session_process.stdin.write(b's') self.session_process.stdin.flush() except BrokenPipeError: pass
def make_input_key(c, control_key_state=None): kc = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) kc.KeyDown = True kc.RepeatCount = 1 cnum = ord(c) if cnum == 3: pid_list = win32console.GetConsoleProcessList() win32console.GenerateConsoleCtrlEvent(win32con.CTRL_C_EVENT, 0) return else: kc.Char = unicode(c) if str(cnum) in CONQUE_WINDOWS_VK: kc.VirtualKeyCode = CONQUE_WINDOWS_VK[str(cnum)] else: kc.VirtualKeyCode = ctypes.windll.user32.VkKeyScanA(cnum) #kc.VirtualKeyCode = ctypes.windll.user32.VkKeyScanA(cnum+96) #kc.ControlKeyState = win32con.LEFT_CTRL_PRESSED return kc
def _inject_key(screen, char): """ Inject a specified character into the input buffers. """ if sys.platform == "win32": event = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) event.RepeatCount = 1 event.ControlKeyState = 0 event.VirtualScanCode = 0 if char >= 0: event.Char = chr(char) event.VirtualKeyCode = ord(chr(char).upper()) else: # Lookup in mapping dicts reverse = dict((v, k) for k, v in screen._EXTRA_KEY_MAP.items()) if char in reverse: event.VirtualKeyCode = reverse[char] else: # Fudge key state required for BACK_TAB if needed. if char == Screen.KEY_BACK_TAB: char = Screen.KEY_TAB event.ControlKeyState = win32con.SHIFT_PRESSED reverse = dict((v, k) for k, v in screen._KEY_MAP.items()) event.VirtualKeyCode = reverse[char] event.KeyDown = 1 screen._stdin.WriteConsoleInput([event]) event.KeyDown = 0 screen._stdin.WriteConsoleInput([event]) else: if char > 0: # Curses uses a LIFO stack for key injection, so reverse the # byte string to be injected. Note that this still works for # ASCII as it is a single char subset of UTF-8. for c in reversed(bytes(chr(char).encode("utf-8"))): curses.ungetch(c) else: reverse = dict((v, k) for k, v in screen._KEY_MAP.items()) curses.ungetch(reverse[char])
def quit(self): if not self.session_status in ["Paused", "Running"]: return if os.name == 'nt': evt = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) evt.Char = 'q' evt.RepeatCount = 1 evt.KeyDown = True evt.VirtualKeyCode=0x0 self.win_stdin.WriteConsoleInput([evt]) else: try: self.session_process.stdin.write(b'q') self.session_process.stdin.flush() except BrokenPipeError: pass print("Waiting for thread to end....") self.thread.join() print("Done") self.session_status = "Aborted" self.save()
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])
def make_input_key(c, control_key_state=None): input_key = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) try: input_key.Char = unicode(c) except: input_key.Char = unicode(' ') input_key.VirtualKeyCode = user32.VkKeyScanA(ord(c)) input_key.KeyDown = True input_key.RepeatCount = 1 if control_key_state: input_key.ControlKeyState = control_key_state return input_key _input_key_return = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) _input_key_return.Char = u'\r' _input_key_return.VirtualKeyCode = win32con.VK_RETURN _input_key_return.KeyDown = True _input_key_return.RepeatCount = 1 _input_key_pause = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) _input_key_pause.Char = unicode(chr(0)) _input_key_pause.VirtualKeyCode = win32con.VK_PAUSE _input_key_pause.KeyDown = True _input_key_pause.RepeatCount = 1 _input_key_escape = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT) _input_key_escape.Char = unicode(chr(27)) _input_key_escape.VirtualKeyCode = win32con.VK_ESCAPE _input_key_escape.KeyDown = True