Python simulate keydown Python simulate keydown python python

Python simulate keydown


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

import ctypesLONG = ctypes.c_longDWORD = ctypes.c_ulongULONG_PTR = ctypes.POINTER(DWORD)WORD = ctypes.c_ushortclass 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 = 0INPUT_KEYBOARD = 1INPUT_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 = 120XBUTTON1 = 0x0001XBUTTON2 = 0x0002MOUSEEVENTF_ABSOLUTE = 0x8000MOUSEEVENTF_HWHEEL = 0x01000MOUSEEVENTF_MOVE = 0x0001MOUSEEVENTF_MOVE_NOCOALESCE = 0x2000MOUSEEVENTF_LEFTDOWN = 0x0002MOUSEEVENTF_LEFTUP = 0x0004MOUSEEVENTF_RIGHTDOWN = 0x0008MOUSEEVENTF_RIGHTUP = 0x0010MOUSEEVENTF_MIDDLEDOWN = 0x0020MOUSEEVENTF_MIDDLEUP = 0x0040MOUSEEVENTF_VIRTUALDESK = 0x4000MOUSEEVENTF_WHEEL = 0x0800MOUSEEVENTF_XDOWN = 0x0080MOUSEEVENTF_XUP = 0x0100def MouseInput(flags, x, y, data):    return MOUSEINPUT(x, y, data, flags, 0, None)VK_LBUTTON = 0x01               # Left mouse buttonVK_RBUTTON = 0x02               # Right mouse buttonVK_CANCEL = 0x03                # Control-break processingVK_MBUTTON = 0x04               # Middle mouse button (three-button mouse)VK_XBUTTON1 = 0x05              # X1 mouse buttonVK_XBUTTON2 = 0x06              # X2 mouse buttonVK_BACK = 0x08                  # BACKSPACE keyVK_TAB = 0x09                   # TAB keyVK_CLEAR = 0x0C                 # CLEAR keyVK_RETURN = 0x0D                # ENTER keyVK_SHIFT = 0x10                 # SHIFT keyVK_CONTROL = 0x11               # CTRL keyVK_MENU = 0x12                  # ALT keyVK_PAUSE = 0x13                 # PAUSE keyVK_CAPITAL = 0x14               # CAPS LOCK keyVK_KANA = 0x15                  # IME Kana modeVK_HANGUL = 0x15                # IME Hangul modeVK_JUNJA = 0x17                 # IME Junja modeVK_FINAL = 0x18                 # IME final modeVK_HANJA = 0x19                 # IME Hanja modeVK_KANJI = 0x19                 # IME Kanji modeVK_ESCAPE = 0x1B                # ESC keyVK_CONVERT = 0x1C               # IME convertVK_NONCONVERT = 0x1D            # IME nonconvertVK_ACCEPT = 0x1E                # IME acceptVK_MODECHANGE = 0x1F            # IME mode change requestVK_SPACE = 0x20                 # SPACEBARVK_PRIOR = 0x21                 # PAGE UP keyVK_NEXT = 0x22                  # PAGE DOWN keyVK_END = 0x23                   # END keyVK_HOME = 0x24                  # HOME keyVK_LEFT = 0x25                  # LEFT ARROW keyVK_UP = 0x26                    # UP ARROW keyVK_RIGHT = 0x27                 # RIGHT ARROW keyVK_DOWN = 0x28                  # DOWN ARROW keyVK_SELECT = 0x29                # SELECT keyVK_PRINT = 0x2A                 # PRINT keyVK_EXECUTE = 0x2B               # EXECUTE keyVK_SNAPSHOT = 0x2C              # PRINT SCREEN keyVK_INSERT = 0x2D                # INS keyVK_DELETE = 0x2E                # DEL keyVK_HELP = 0x2F                  # HELP keyVK_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 keyVK_NUMPAD0 = 0x60               # Numeric keypad 0 keyVK_NUMPAD1 = 0x61               # Numeric keypad 1 keyVK_NUMPAD2 = 0x62               # Numeric keypad 2 keyVK_NUMPAD3 = 0x63               # Numeric keypad 3 keyVK_NUMPAD4 = 0x64               # Numeric keypad 4 keyVK_NUMPAD5 = 0x65               # Numeric keypad 5 keyVK_NUMPAD6 = 0x66               # Numeric keypad 6 keyVK_NUMPAD7 = 0x67               # Numeric keypad 7 keyVK_NUMPAD8 = 0x68               # Numeric keypad 8 keyVK_NUMPAD9 = 0x69               # Numeric keypad 9 keyVK_MULTIPLY = 0x6A              # Multiply keyVK_ADD = 0x6B                   # Add keyVK_SEPARATOR = 0x6C             # Separator keyVK_SUBTRACT = 0x6D              # Subtract keyVK_DECIMAL = 0x6E               # Decimal keyVK_DIVIDE = 0x6F                # Divide keyVK_F1 = 0x70                    # F1 keyVK_F2 = 0x71                    # F2 keyVK_F3 = 0x72                    # F3 keyVK_F4 = 0x73                    # F4 keyVK_F5 = 0x74                    # F5 keyVK_F6 = 0x75                    # F6 keyVK_F7 = 0x76                    # F7 keyVK_F8 = 0x77                    # F8 keyVK_F9 = 0x78                    # F9 keyVK_F10 = 0x79                   # F10 keyVK_F11 = 0x7A                   # F11 keyVK_F12 = 0x7B                   # F12 keyVK_F13 = 0x7C                   # F13 keyVK_F14 = 0x7D                   # F14 keyVK_F15 = 0x7E                   # F15 keyVK_F16 = 0x7F                   # F16 keyVK_F17 = 0x80                   # F17 keyVK_F18 = 0x81                   # F18 keyVK_F19 = 0x82                   # F19 keyVK_F20 = 0x83                   # F20 keyVK_F21 = 0x84                   # F21 keyVK_F22 = 0x85                   # F22 keyVK_F23 = 0x86                   # F23 keyVK_F24 = 0x87                   # F24 keyVK_NUMLOCK = 0x90               # NUM LOCK keyVK_SCROLL = 0x91                # SCROLL LOCK keyVK_LSHIFT = 0xA0                # Left SHIFT keyVK_RSHIFT = 0xA1                # Right SHIFT keyVK_LCONTROL = 0xA2              # Left CONTROL keyVK_RCONTROL = 0xA3              # Right CONTROL keyVK_LMENU = 0xA4                 # Left MENU keyVK_RMENU = 0xA5                 # Right MENU keyVK_BROWSER_BACK = 0xA6          # Browser Back keyVK_BROWSER_FORWARD = 0xA7       # Browser Forward keyVK_BROWSER_REFRESH = 0xA8       # Browser Refresh keyVK_BROWSER_STOP = 0xA9          # Browser Stop keyVK_BROWSER_SEARCH = 0xAA        # Browser Search keyVK_BROWSER_FAVORITES = 0xAB     # Browser Favorites keyVK_BROWSER_HOME = 0xAC          # Browser Start and Home keyVK_VOLUME_MUTE = 0xAD           # Volume Mute keyVK_VOLUME_DOWN = 0xAE           # Volume Down keyVK_VOLUME_UP = 0xAF             # Volume Up keyVK_MEDIA_NEXT_TRACK = 0xB0      # Next Track keyVK_MEDIA_PREV_TRACK = 0xB1      # Previous Track keyVK_MEDIA_STOP = 0xB2            # Stop Media keyVK_MEDIA_PLAY_PAUSE = 0xB3      # Play/Pause Media keyVK_LAUNCH_MAIL = 0xB4           # Start Mail keyVK_LAUNCH_MEDIA_SELECT = 0xB5   # Select Media keyVK_LAUNCH_APP1 = 0xB6           # Start Application 1 keyVK_LAUNCH_APP2 = 0xB7           # Start Application 2 keyVK_OEM_1 = 0xBA                 # Used for miscellaneous characters; it can vary by keyboard.                                # For the US standard keyboard, the ';:' keyVK_OEM_PLUS = 0xBB              # For any country/region, the '+' keyVK_OEM_COMMA = 0xBC             # For any country/region, the ',' keyVK_OEM_MINUS = 0xBD             # For any country/region, the '-' keyVK_OEM_PERIOD = 0xBE            # For any country/region, the '.' keyVK_OEM_2 = 0xBF                 # Used for miscellaneous characters; it can vary by keyboard.                                # For the US standard keyboard, the '/?' keyVK_OEM_3 = 0xC0                 # Used for miscellaneous characters; it can vary by keyboard.                                # For the US standard keyboard, the '`~' keyVK_OEM_4 = 0xDB                 # Used for miscellaneous characters; it can vary by keyboard.                                # For the US standard keyboard, the '[{' keyVK_OEM_5 = 0xDC                 # Used for miscellaneous characters; it can vary by keyboard.                                # For the US standard keyboard, the '\|' keyVK_OEM_6 = 0xDD                 # Used for miscellaneous characters; it can vary by keyboard.                                # For the US standard keyboard, the ']}' keyVK_OEM_7 = 0xDE                 # Used for miscellaneous characters; it can vary by keyboard.                                # For the US standard keyboard, the 'single-quote/double-quote' keyVK_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 keyboardVK_PROCESSKEY = 0xE5            # IME PROCESS keyVK_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_KEYUPVK_ATTN = 0xF6                  # Attn keyVK_CRSEL = 0xF7                 # CrSel keyVK_EXSEL = 0xF8                 # ExSel keyVK_EREOF = 0xF9                 # Erase EOF keyVK_PLAY = 0xFA                  # Play keyVK_ZOOM = 0xFB                  # Zoom keyVK_PA1 = 0xFD                   # PA1 keyVK_OEM_CLEAR = 0xFE             # Clear keyKEYEVENTF_EXTENDEDKEY = 0x0001KEYEVENTF_KEYUP = 0x0002KEYEVENTF_SCANCODE = 0x0008KEYEVENTF_UNICODE = 0x0004KEY_0 = 0x30KEY_1 = 0x31KEY_2 = 0x32KEY_3 = 0x33KEY_4 = 0x34KEY_5 = 0x35KEY_6 = 0x36KEY_7 = 0x37KEY_8 = 0x38KEY_9 = 0x39KEY_A = 0x41KEY_B = 0x42KEY_C = 0x43KEY_D = 0x44KEY_E = 0x45KEY_F = 0x46KEY_G = 0x47KEY_H = 0x48KEY_I = 0x49KEY_J = 0x4AKEY_K = 0x4BKEY_L = 0x4CKEY_M = 0x4DKEY_N = 0x4EKEY_O = 0x4FKEY_P = 0x50KEY_Q = 0x51KEY_R = 0x52KEY_S = 0x53KEY_T = 0x54KEY_U = 0x55KEY_V = 0x56KEY_W = 0x57KEY_X = 0x58KEY_Y = 0x59KEY_Z = 0x5Adef 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 stringUPPER = 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, sysdef 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()


If you're using Python for Windows then there's a very good chance that you have the win32api module, which handles hooking into the API for you...

import win32apiimport win32conwin32api.keybd_event(win32con.SHIFT_PRESSED, 0,win32con.KEYEVENTF_EXTENDEDKEY, 0)

Does that help? (p.s. you should install IPython if, at all possible, it's massively helpful for experimenting)


I know that this question is really old, but I found a nice library: PyUserInput.I am not sure how to download it in windows(I haven't downloaded libraries for windows for a long time). In Linux is easy just download pip(if you haven't):sudo apt-get install pip and then sudo pip install pyuserinput.And then the code is realy simple:

#imports the libraryfrom pykeyboard import PyKeyboard#import the sleep functionfrom time import sleep#initialize the keyboard simulatorkeyboard = PyKeyboard()#presses the keykeyboard.press_key('x')#waits five seconds before releasing the keysleep(5)#releases the keykeyboard.release_key('x')