Advertisement
fviktor

Python script to simulate keypresses in Windows

Sep 27th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.53 KB | None | 0 0
  1. """Simulates keypresses
  2.  
  3. Based on:
  4. https://stackoverflow.com/questions/14489013/simulate-python-keypresses-for-controlling-a-game
  5.  
  6. Key scan codes:
  7. https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-6.0/aa299374(v=vs.60)?redirectedfrom=MSDN
  8.  
  9. """
  10. import ctypes
  11. import time
  12. import random
  13.  
  14.  
  15. # DirectInput keyboard scan codes
  16. # https://gist.github.com/tracend/912308
  17. class Key:
  18.     ESCAPE = 0x01
  19.     NUM1 = 0x02
  20.     NUM2 = 0x03
  21.     NUM3 = 0x04
  22.     NUM4 = 0x05
  23.     NUM5 = 0x06
  24.     NUM6 = 0x07
  25.     NUM7 = 0x08
  26.     NUM8 = 0x09
  27.     NUM9 = 0x0A
  28.     NUM0 = 0x0B
  29.     MINUS = 0x0C  # - on main keyboard
  30.     EQUALS = 0x0D
  31.     BACK = 0x0E  # backspace
  32.     TAB = 0x0F
  33.     Q = 0x10
  34.     W = 0x11
  35.     E = 0x12
  36.     R = 0x13
  37.     T = 0x14
  38.     Y = 0x15
  39.     U = 0x16
  40.     I = 0x17
  41.     O = 0x18
  42.     P = 0x19
  43.     LBRACKET = 0x1A
  44.     RBRACKET = 0x1B
  45.     RETURN = 0x1C  # Enter on main keyboard
  46.     LCONTROL = 0x1D
  47.     A = 0x1E
  48.     S = 0x1F
  49.     D = 0x20
  50.     F = 0x21
  51.     G = 0x22
  52.     H = 0x23
  53.     J = 0x24
  54.     K = 0x25
  55.     L = 0x26
  56.     SEMICOLON = 0x27
  57.     APOSTROPHE = 0x28
  58.     GRAVE = 0x29  # accent grave
  59.     LSHIFT = 0x2A
  60.     BACKSLASH = 0x2B
  61.     Z = 0x2C
  62.     X = 0x2D
  63.     C = 0x2E
  64.     V = 0x2F
  65.     B = 0x30
  66.     N = 0x31
  67.     M = 0x32
  68.     COMMA = 0x33
  69.     PERIOD = 0x34  # . on main keyboard
  70.     SLASH = 0x35  # / on main keyboard
  71.     RSHIFT = 0x36
  72.     MULTIPLY = 0x37  # * on numeric keypad
  73.     LMENU = 0x38  # left Alt
  74.     SPACE = 0x39
  75.     CAPITAL = 0x3A
  76.     F1 = 0x3B
  77.     F2 = 0x3C
  78.     F3 = 0x3D
  79.     F4 = 0x3E
  80.     F5 = 0x3F
  81.     F6 = 0x40
  82.     F7 = 0x41
  83.     F8 = 0x42
  84.     F9 = 0x43
  85.     F10 = 0x44
  86.     NUMLOCK = 0x45
  87.     SCROLL = 0x46  # Scroll Lock
  88.     NUMPAD7 = 0x47
  89.     NUMPAD8 = 0x48
  90.     NUMPAD9 = 0x49
  91.     SUBTRACT = 0x4A  # - on numeric keypad
  92.     NUMPAD4 = 0x4B
  93.     NUMPAD5 = 0x4C
  94.     NUMPAD6 = 0x4D
  95.     ADD = 0x4E  # + on numeric keypad
  96.     NUMPAD1 = 0x4F
  97.     NUMPAD2 = 0x50
  98.     NUMPAD3 = 0x51
  99.     NUMPAD0 = 0x52
  100.     DECIMAL = 0x53  # . on numeric keypad
  101.     OEM_102 = 0x56  # <> or \| on RT 102-key keyboard (Non-U.S.)
  102.     F11 = 0x57
  103.     F12 = 0x58
  104.     F13 = 0x64  # (NEC PC98)
  105.     F14 = 0x65  # (NEC PC98)
  106.     F15 = 0x66  # (NEC PC98)
  107.     KANA = 0x70  # (Japanese keyboard)
  108.     ABNT_C1 = 0x73  # /? on Brazilian keyboard
  109.     CONVERT = 0x79  # (Japanese keyboard)
  110.     NOCONVERT = 0x7B  # (Japanese keyboard)
  111.     YEN = 0x7D  # (Japanese keyboard)
  112.     ABNT_C2 = 0x7E  # Numpad . on Brazilian keyboard
  113.     NUMPADEQUALS = 0x8D  # = on numeric keypad (NEC PC98)
  114.     PREVTRACK = 0x90  # Previous Track (DIK_CIRCUMFLEX on Japanese keyboard)
  115.     AT = 0x91  # (NEC PC98)
  116.     COLON = 0x92  # (NEC PC98)
  117.     UNDERLINE = 0x93  # (NEC PC98)
  118.     KANJI = 0x94  # (Japanese keyboard)
  119.     STOP = 0x95  # (NEC PC98)
  120.     AX = 0x96  # (Japan AX)
  121.     UNLABELED = 0x97  # (J3100)
  122.     NEXTTRACK = 0x99  # Next Track
  123.     NUMPADENTER = 0x9C  # Enter on numeric keypad
  124.     RCONTROL = 0x9D
  125.     MUTE = 0xA0  # Mute
  126.     CALCULATOR = 0xA1  # Calculator
  127.     PLAYPAUSE = 0xA2  # Play / Pause
  128.     MEDIASTOP = 0xA4  # Media Stop
  129.     VOLUMEDOWN = 0xAE  # Volume -
  130.     VOLUMEUP = 0xB0  # Volume +
  131.     WEBHOME = 0xB2  # Web home
  132.     NUMPADCOMMA = 0xB3  # , on numeric keypad (NEC PC98)
  133.     DIVIDE = 0xB5  # / on numeric keypad
  134.     SYSRQ = 0xB7
  135.     RMENU = 0xB8  # right Alt
  136.     PAUSE = 0xC5  # Pause
  137.     HOME = 0xC7  # Home on arrow keypad
  138.     UP = 0xC8  # UpArrow on arrow keypad
  139.     PRIOR = 0xC9  # PgUp on arrow keypad
  140.     LEFT = 0xCB  # LeftArrow on arrow keypad
  141.     RIGHT = 0xCD  # RightArrow on arrow keypad
  142.     END = 0xCF  # End on arrow keypad
  143.     DOWN = 0xD0  # DownArrow on arrow keypad
  144.     NEXT = 0xD1  # PgDn on arrow keypad
  145.     INSERT = 0xD2  # Insert on arrow keypad
  146.     DELETE = 0xD3  # Delete on arrow keypad
  147.     LWIN = 0xDB  # Left Windows key
  148.     RWIN = 0xDC  # Right Windows key
  149.     APPS = 0xDD  # AppMenu key
  150.     POWER = 0xDE  # System Power
  151.     SLEEP = 0xDF  # System Sleep
  152.     WAKE = 0xE3  # System Wake
  153.     WEBSEARCH = 0xE5  # Web Search
  154.     WEBFAVORITES = 0xE6  # Web Favorites
  155.     WEBREFRESH = 0xE7  # Web Refresh
  156.     WEBSTOP = 0xE8  # Web Stop
  157.     WEBFORWARD = 0xE9  # Web Forward
  158.     WEBBACK = 0xEA  # Web Back
  159.     MYCOMPUTER = 0xEB  # My Computer
  160.     MAIL = 0xEC  # Mail
  161.     MEDIASELECT = 0xED  # Media Select
  162.  
  163.  
  164. SendInput = ctypes.windll.user32.SendInput
  165.  
  166. UnsignedLongPointer = ctypes.POINTER(ctypes.c_ulong)
  167.  
  168.  
  169. class KeyBdInput(ctypes.Structure):
  170.     _fields_ = [("wVk", ctypes.c_ushort),
  171.                 ("wScan", ctypes.c_ushort),
  172.                 ("dwFlags", ctypes.c_ulong),
  173.                 ("time", ctypes.c_ulong),
  174.                 ("dwExtraInfo", UnsignedLongPointer)]
  175.  
  176.  
  177. class HardwareInput(ctypes.Structure):
  178.     _fields_ = [("uMsg", ctypes.c_ulong),
  179.                 ("wParamL", ctypes.c_short),
  180.                 ("wParamH", ctypes.c_ushort)]
  181.  
  182.  
  183. class MouseInput(ctypes.Structure):
  184.     _fields_ = [("dx", ctypes.c_long),
  185.                 ("dy", ctypes.c_long),
  186.                 ("mouseData", ctypes.c_ulong),
  187.                 ("dwFlags", ctypes.c_ulong),
  188.                 ("time", ctypes.c_ulong),
  189.                 ("dwExtraInfo", UnsignedLongPointer)]
  190.  
  191.  
  192. class Input_I(ctypes.Union):
  193.     _fields_ = [("ki", KeyBdInput),
  194.                 ("mi", MouseInput),
  195.                 ("hi", HardwareInput)]
  196.  
  197.  
  198. class Input(ctypes.Structure):
  199.     _fields_ = [("type", ctypes.c_ulong),
  200.                 ("ii", Input_I)]
  201.  
  202.  
  203. def press_key(hexKeyCode):
  204.     extra = ctypes.c_ulong(0)
  205.     ii_ = Input_I()
  206.     ii_.ki = KeyBdInput(0, hexKeyCode, 0x0008, 0, ctypes.pointer(extra))
  207.     x = Input(ctypes.c_ulong(1), ii_)
  208.     ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
  209.  
  210.  
  211. def release_key(hexKeyCode):
  212.     extra = ctypes.c_ulong(0)
  213.     ii_ = Input_I()
  214.     ii_.ki = KeyBdInput(0, hexKeyCode, 0x0008 | 0x0002, 0, ctypes.pointer(extra))
  215.     x = Input(ctypes.c_ulong(1), ii_)
  216.     ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))
  217.  
  218.  
  219. INITIAL_WAIT = 5
  220. CRYO_PERIOD_MIN = 120
  221. CRYO_PERIOD_MAX = 290
  222.  
  223.  
  224. def use():
  225.     press_key(Key.F)
  226.     time.sleep(0.1)
  227.     release_key(Key.F)
  228.  
  229.  
  230. def main():
  231.     print('Waiting for %d seconds to let you switch back to the game' % INITIAL_WAIT)
  232.     time.sleep(INITIAL_WAIT)
  233.  
  234.     while True:
  235.         print('Exiting cryo')
  236.         use()
  237.  
  238.         time.sleep(1)
  239.  
  240.         print('Re-entering cryo')
  241.         use()
  242.  
  243.         delay = random.randrange(CRYO_PERIOD_MIN, CRYO_PERIOD_MAX + 1)
  244.         print('Waiting for %d seconds in cryo' % delay)
  245.         time.sleep(delay)
  246.  
  247.  
  248. if __name__ == '__main__':
  249.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement