Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python simulate keydown

After searching for several hours i´m wondering if its possible to simulate a keydown press on the keyboard. For example I want my program to hold the x key down for five seconds so when I run it in notepad it would look like to see something like this: xxxxxxxxxxxxx. I tried around with different pieces of code on the internet, the best thing I could find so far is this:

import ctypes import time user32 = ctypes.windll.user32 inputhex = raw_input("Please enter your desired key's code (HEX): ") keycode = int(inputhex, 16) time.sleep(1) #VOID keybd_event(BYTE bVk, BYTE bScan, DWORD dwFlags, PTR dwExtraInfo); user32.keybd_event(keycode,0,2,0) #is the code for KEYDOWN time.sleep(5) #user32.keybd_event(keycode,0,0,0) #is the code for KEYDUP[/code] 

The Sendkey module doesn't solve my problem either becuase it only allows you to send a single keypress and not a hold key down event. I know about autoit, used it in the past, but I just really want to know if this is possible with python and how. P.S. i'm using python for windows

like image 828
inControl Avatar asked Aug 10 '12 18:08

inControl


People also ask

How do you simulate keystrokes?

To simulate native-language keystrokes, you can also use the [Xnn] or [Dnn] constants in the string passed to the Keys method. nn specifies the virtual-key code of the key to be “pressed”. For instance, [X221]u[X221]e will “type” the u and e characters with the circumflex accent.

How do you code Press any key to continue in Python?

In Python 3, use input() : input("Press Enter to continue...") In Python 2, use raw_input() : raw_input("Press Enter to continue...")


1 Answers

This code should get you started. ctypes is used heavily. At the bottom, you will see example code.

import ctypes  LONG = ctypes.c_long DWORD = ctypes.c_ulong ULONG_PTR = ctypes.POINTER(DWORD) WORD = ctypes.c_ushort  class MOUSEINPUT(ctypes.Structure):     _fields_ = (('dx', LONG),                 ('dy', LONG),                 ('mouseData', DWORD),                 ('dwFlags', DWORD),                 ('time', DWORD),                 ('dwExtraInfo', ULONG_PTR))                  class KEYBDINPUT(ctypes.Structure):     _fields_ = (('wVk', WORD),                 ('wScan', WORD),                 ('dwFlags', DWORD),                 ('time', DWORD),                 ('dwExtraInfo', ULONG_PTR))                  class HARDWAREINPUT(ctypes.Structure):     _fields_ = (('uMsg', DWORD),                 ('wParamL', WORD),                 ('wParamH', WORD))                  class _INPUTunion(ctypes.Union):     _fields_ = (('mi', MOUSEINPUT),                 ('ki', KEYBDINPUT),                 ('hi', HARDWAREINPUT))                  class INPUT(ctypes.Structure):     _fields_ = (('type', DWORD),                 ('union', _INPUTunion))                  def SendInput(*inputs):     nInputs = len(inputs)     LPINPUT = INPUT * nInputs     pInputs = LPINPUT(*inputs)     cbSize = ctypes.c_int(ctypes.sizeof(INPUT))     return ctypes.windll.user32.SendInput(nInputs, pInputs, cbSize)  INPUT_MOUSE = 0 INPUT_KEYBOARD = 1 INPUT_HARDWARE = 2      def Input(structure):     if isinstance(structure, MOUSEINPUT):         return INPUT(INPUT_MOUSE, _INPUTunion(mi=structure))     if isinstance(structure, KEYBDINPUT):         return INPUT(INPUT_KEYBOARD, _INPUTunion(ki=structure))     if isinstance(structure, HARDWAREINPUT):         return INPUT(INPUT_HARDWARE, _INPUTunion(hi=structure))     raise TypeError('Cannot create INPUT structure!')  WHEEL_DELTA = 120 XBUTTON1 = 0x0001 XBUTTON2 = 0x0002 MOUSEEVENTF_ABSOLUTE = 0x8000 MOUSEEVENTF_HWHEEL = 0x01000 MOUSEEVENTF_MOVE = 0x0001 MOUSEEVENTF_MOVE_NOCOALESCE = 0x2000 MOUSEEVENTF_LEFTDOWN = 0x0002 MOUSEEVENTF_LEFTUP = 0x0004 MOUSEEVENTF_RIGHTDOWN = 0x0008 MOUSEEVENTF_RIGHTUP = 0x0010 MOUSEEVENTF_MIDDLEDOWN = 0x0020 MOUSEEVENTF_MIDDLEUP = 0x0040 MOUSEEVENTF_VIRTUALDESK = 0x4000 MOUSEEVENTF_WHEEL = 0x0800 MOUSEEVENTF_XDOWN = 0x0080 MOUSEEVENTF_XUP = 0x0100  def MouseInput(flags, x, y, data):     return MOUSEINPUT(x, y, data, flags, 0, None)  VK_LBUTTON = 0x01               # Left mouse button VK_RBUTTON = 0x02               # Right mouse button VK_CANCEL = 0x03                # Control-break processing VK_MBUTTON = 0x04               # Middle mouse button (three-button mouse) VK_XBUTTON1 = 0x05              # X1 mouse button VK_XBUTTON2 = 0x06              # X2 mouse button VK_BACK = 0x08                  # BACKSPACE key VK_TAB = 0x09                   # TAB key VK_CLEAR = 0x0C                 # CLEAR key VK_RETURN = 0x0D                # ENTER key VK_SHIFT = 0x10                 # SHIFT key VK_CONTROL = 0x11               # CTRL key VK_MENU = 0x12                  # ALT key VK_PAUSE = 0x13                 # PAUSE key VK_CAPITAL = 0x14               # CAPS LOCK key VK_KANA = 0x15                  # IME Kana mode VK_HANGUL = 0x15                # IME Hangul mode VK_JUNJA = 0x17                 # IME Junja mode VK_FINAL = 0x18                 # IME final mode VK_HANJA = 0x19                 # IME Hanja mode VK_KANJI = 0x19                 # IME Kanji mode VK_ESCAPE = 0x1B                # ESC key VK_CONVERT = 0x1C               # IME convert VK_NONCONVERT = 0x1D            # IME nonconvert VK_ACCEPT = 0x1E                # IME accept VK_MODECHANGE = 0x1F            # IME mode change request VK_SPACE = 0x20                 # SPACEBAR VK_PRIOR = 0x21                 # PAGE UP key VK_NEXT = 0x22                  # PAGE DOWN key VK_END = 0x23                   # END key VK_HOME = 0x24                  # HOME key VK_LEFT = 0x25                  # LEFT ARROW key VK_UP = 0x26                    # UP ARROW key VK_RIGHT = 0x27                 # RIGHT ARROW key VK_DOWN = 0x28                  # DOWN ARROW key VK_SELECT = 0x29                # SELECT key VK_PRINT = 0x2A                 # PRINT key VK_EXECUTE = 0x2B               # EXECUTE key VK_SNAPSHOT = 0x2C              # PRINT SCREEN key VK_INSERT = 0x2D                # INS key VK_DELETE = 0x2E                # DEL key VK_HELP = 0x2F                  # HELP key VK_LWIN = 0x5B                  # Left Windows key (Natural keyboard) VK_RWIN = 0x5C                  # Right Windows key (Natural keyboard) VK_APPS = 0x5D                  # Applications key (Natural keyboard) VK_SLEEP = 0x5F                 # Computer Sleep key VK_NUMPAD0 = 0x60               # Numeric keypad 0 key VK_NUMPAD1 = 0x61               # Numeric keypad 1 key VK_NUMPAD2 = 0x62               # Numeric keypad 2 key VK_NUMPAD3 = 0x63               # Numeric keypad 3 key VK_NUMPAD4 = 0x64               # Numeric keypad 4 key VK_NUMPAD5 = 0x65               # Numeric keypad 5 key VK_NUMPAD6 = 0x66               # Numeric keypad 6 key VK_NUMPAD7 = 0x67               # Numeric keypad 7 key VK_NUMPAD8 = 0x68               # Numeric keypad 8 key VK_NUMPAD9 = 0x69               # Numeric keypad 9 key VK_MULTIPLY = 0x6A              # Multiply key VK_ADD = 0x6B                   # Add key VK_SEPARATOR = 0x6C             # Separator key VK_SUBTRACT = 0x6D              # Subtract key VK_DECIMAL = 0x6E               # Decimal key VK_DIVIDE = 0x6F                # Divide key VK_F1 = 0x70                    # F1 key VK_F2 = 0x71                    # F2 key VK_F3 = 0x72                    # F3 key VK_F4 = 0x73                    # F4 key VK_F5 = 0x74                    # F5 key VK_F6 = 0x75                    # F6 key VK_F7 = 0x76                    # F7 key VK_F8 = 0x77                    # F8 key VK_F9 = 0x78                    # F9 key VK_F10 = 0x79                   # F10 key VK_F11 = 0x7A                   # F11 key VK_F12 = 0x7B                   # F12 key VK_F13 = 0x7C                   # F13 key VK_F14 = 0x7D                   # F14 key VK_F15 = 0x7E                   # F15 key VK_F16 = 0x7F                   # F16 key VK_F17 = 0x80                   # F17 key VK_F18 = 0x81                   # F18 key VK_F19 = 0x82                   # F19 key VK_F20 = 0x83                   # F20 key VK_F21 = 0x84                   # F21 key VK_F22 = 0x85                   # F22 key VK_F23 = 0x86                   # F23 key VK_F24 = 0x87                   # F24 key VK_NUMLOCK = 0x90               # NUM LOCK key VK_SCROLL = 0x91                # SCROLL LOCK key VK_LSHIFT = 0xA0                # Left SHIFT key VK_RSHIFT = 0xA1                # Right SHIFT key VK_LCONTROL = 0xA2              # Left CONTROL key VK_RCONTROL = 0xA3              # Right CONTROL key VK_LMENU = 0xA4                 # Left MENU key VK_RMENU = 0xA5                 # Right MENU key VK_BROWSER_BACK = 0xA6          # Browser Back key VK_BROWSER_FORWARD = 0xA7       # Browser Forward key VK_BROWSER_REFRESH = 0xA8       # Browser Refresh key VK_BROWSER_STOP = 0xA9          # Browser Stop key VK_BROWSER_SEARCH = 0xAA        # Browser Search key VK_BROWSER_FAVORITES = 0xAB     # Browser Favorites key VK_BROWSER_HOME = 0xAC          # Browser Start and Home key VK_VOLUME_MUTE = 0xAD           # Volume Mute key VK_VOLUME_DOWN = 0xAE           # Volume Down key VK_VOLUME_UP = 0xAF             # Volume Up key VK_MEDIA_NEXT_TRACK = 0xB0      # Next Track key VK_MEDIA_PREV_TRACK = 0xB1      # Previous Track key VK_MEDIA_STOP = 0xB2            # Stop Media key VK_MEDIA_PLAY_PAUSE = 0xB3      # Play/Pause Media key VK_LAUNCH_MAIL = 0xB4           # Start Mail key VK_LAUNCH_MEDIA_SELECT = 0xB5   # Select Media key VK_LAUNCH_APP1 = 0xB6           # Start Application 1 key VK_LAUNCH_APP2 = 0xB7           # Start Application 2 key VK_OEM_1 = 0xBA                 # Used for miscellaneous characters; it can vary by keyboard.                                 # For the US standard keyboard, the ';:' key VK_OEM_PLUS = 0xBB              # For any country/region, the '+' key VK_OEM_COMMA = 0xBC             # For any country/region, the ',' key VK_OEM_MINUS = 0xBD             # For any country/region, the '-' key VK_OEM_PERIOD = 0xBE            # For any country/region, the '.' key VK_OEM_2 = 0xBF                 # Used for miscellaneous characters; it can vary by keyboard.                                 # For the US standard keyboard, the '/?' key VK_OEM_3 = 0xC0                 # Used for miscellaneous characters; it can vary by keyboard.                                 # For the US standard keyboard, the '`~' key VK_OEM_4 = 0xDB                 # Used for miscellaneous characters; it can vary by keyboard.                                 # For the US standard keyboard, the '[{' key VK_OEM_5 = 0xDC                 # Used for miscellaneous characters; it can vary by keyboard.                                 # For the US standard keyboard, the '\|' key VK_OEM_6 = 0xDD                 # Used for miscellaneous characters; it can vary by keyboard.                                 # For the US standard keyboard, the ']}' key VK_OEM_7 = 0xDE                 # Used for miscellaneous characters; it can vary by keyboard.                                 # For the US standard keyboard, the 'single-quote/double-quote' key VK_OEM_8 = 0xDF                 # Used for miscellaneous characters; it can vary by keyboard. VK_OEM_102 = 0xE2               # Either the angle bracket key or the backslash key on the RT 102-key keyboard VK_PROCESSKEY = 0xE5            # IME PROCESS key VK_PACKET = 0xE7                # Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP VK_ATTN = 0xF6                  # Attn key VK_CRSEL = 0xF7                 # CrSel key VK_EXSEL = 0xF8                 # ExSel key VK_EREOF = 0xF9                 # Erase EOF key VK_PLAY = 0xFA                  # Play key VK_ZOOM = 0xFB                  # Zoom key VK_PA1 = 0xFD                   # PA1 key VK_OEM_CLEAR = 0xFE             # Clear key  KEYEVENTF_EXTENDEDKEY = 0x0001 KEYEVENTF_KEYUP = 0x0002 KEYEVENTF_SCANCODE = 0x0008 KEYEVENTF_UNICODE = 0x0004  KEY_0 = 0x30 KEY_1 = 0x31 KEY_2 = 0x32 KEY_3 = 0x33 KEY_4 = 0x34 KEY_5 = 0x35 KEY_6 = 0x36 KEY_7 = 0x37 KEY_8 = 0x38 KEY_9 = 0x39 KEY_A = 0x41 KEY_B = 0x42 KEY_C = 0x43 KEY_D = 0x44 KEY_E = 0x45 KEY_F = 0x46 KEY_G = 0x47 KEY_H = 0x48 KEY_I = 0x49 KEY_J = 0x4A KEY_K = 0x4B KEY_L = 0x4C KEY_M = 0x4D KEY_N = 0x4E KEY_O = 0x4F KEY_P = 0x50 KEY_Q = 0x51 KEY_R = 0x52 KEY_S = 0x53 KEY_T = 0x54 KEY_U = 0x55 KEY_V = 0x56 KEY_W = 0x57 KEY_X = 0x58 KEY_Y = 0x59 KEY_Z = 0x5A  def KeybdInput(code, flags):     return KEYBDINPUT(code, code, flags, 0, None)  def HardwareInput(message, parameter):     return HARDWAREINPUT(message & 0xFFFFFFFF,                          parameter & 0xFFFF,                          parameter >> 16 & 0xFFFF)  def Mouse(flags, x=0, y=0, data=0):     return Input(MouseInput(flags, x, y, data))  def Keyboard(code, flags=0):     return Input(KeybdInput(code, flags))  def Hardware(message, parameter=0):     return Input(HardwareInput(message, parameter))  ################################################################################  import string  UPPER = frozenset('~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?') LOWER = frozenset("`1234567890-=qwertyuiop[]\\asdfghjkl;'zxcvbnm,./") ORDER = string.ascii_letters + string.digits + ' \b\r\t' ALTER = dict(zip('!@#$%^&*()', '1234567890')) OTHER = {'`': VK_OEM_3,          '~': VK_OEM_3,          '-': VK_OEM_MINUS,          '_': VK_OEM_MINUS,          '=': VK_OEM_PLUS,          '+': VK_OEM_PLUS,          '[': VK_OEM_4,          '{': VK_OEM_4,          ']': VK_OEM_6,          '}': VK_OEM_6,          '\\': VK_OEM_5,          '|': VK_OEM_5,          ';': VK_OEM_1,          ':': VK_OEM_1,          "'": VK_OEM_7,          '"': VK_OEM_7,          ',': VK_OEM_COMMA,          '<': VK_OEM_COMMA,          '.': VK_OEM_PERIOD,          '>': VK_OEM_PERIOD,          '/': VK_OEM_2,          '?': VK_OEM_2}  def keyboard_stream(string):     mode = False     for character in string.replace('\r\n', '\r').replace('\n', '\r'):         if mode and character in LOWER or not mode and character in UPPER:             yield Keyboard(VK_SHIFT, mode and KEYEVENTF_KEYUP)             mode = not mode         character = ALTER.get(character, character)         if character in ORDER:             code = ord(character.upper())         elif character in OTHER:             code = OTHER[character]         else:             continue             #Or, to abort on unavailable character             #raise ValueError('String is not understood!')         yield Keyboard(code)         yield Keyboard(code, KEYEVENTF_KEYUP)     if mode:         yield Keyboard(VK_SHIFT, KEYEVENTF_KEYUP)  ################################################################################  import time, sys  def main():     time.sleep(5)     for event in keyboard_stream('o2E^uXh#:SHn&HQ+t]YF'):         SendInput(event)         time.sleep(0.1)      ##if __name__ == '__main__': ##    main()  def switch_program():     SendInput(Keyboard(VK_MENU), Keyboard(VK_TAB))     time.sleep(0.2)     SendInput(Keyboard(VK_TAB, KEYEVENTF_KEYUP),               Keyboard(VK_MENU, KEYEVENTF_KEYUP))     time.sleep(0.2)  def select_line():     SendInput(Keyboard(VK_SHIFT, KEYEVENTF_EXTENDEDKEY),               Keyboard(VK_END, KEYEVENTF_EXTENDEDKEY))     time.sleep(0.2)     SendInput(Keyboard(VK_SHIFT, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP),               Keyboard(VK_END, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP))     time.sleep(0.2)  def copy_line():     SendInput(Keyboard(VK_CONTROL), Keyboard(KEY_C))     time.sleep(0.2)     SendInput(Keyboard(VK_CONTROL, KEYEVENTF_KEYUP),               Keyboard(KEY_C, KEYEVENTF_KEYUP))     time.sleep(0.2)  def next_line():     SendInput(Keyboard(VK_HOME), Keyboard(VK_DOWN))     time.sleep(0.2)     SendInput(Keyboard(VK_HOME, KEYEVENTF_KEYUP),               Keyboard(VK_DOWN, KEYEVENTF_KEYUP))     time.sleep(0.2)  def prepare_text():     # Open Text     SendInput(Keyboard(KEY_M))     time.sleep(0.2)     SendInput(Keyboard(KEY_M, KEYEVENTF_KEYUP))     time.sleep(0.2)     # Goto Area     SendInput(Keyboard(VK_TAB))     time.sleep(0.2)     SendInput(Keyboard(VK_TAB, KEYEVENTF_KEYUP))     time.sleep(0.2)     # Paste Message     SendInput(Keyboard(VK_CONTROL), Keyboard(KEY_V))     time.sleep(0.2)     SendInput(Keyboard(VK_CONTROL, KEYEVENTF_KEYUP),               Keyboard(KEY_V, KEYEVENTF_KEYUP))     time.sleep(0.2)     # Goto Button     SendInput(Keyboard(VK_TAB))     time.sleep(0.2)     SendInput(Keyboard(VK_TAB, KEYEVENTF_KEYUP))     time.sleep(0.2)  def send_one_message():     select_line()     copy_line()     next_line()     switch_program()     prepare_text()     # Send Message     SendInput(Keyboard(VK_RETURN))     time.sleep(0.2)     SendInput(Keyboard(VK_RETURN, KEYEVENTF_KEYUP))     time.sleep(10)     switch_program()      def send_messages(total):     time.sleep(10)     for _ in range(total):         send_one_message() 
like image 173
Noctis Skytower Avatar answered Sep 29 '22 04:09

Noctis Skytower