Python模拟keydown
search几个小时后,我想知道是否有可能模拟keydown键盘上的按下。 例如,我希望我的程序按住“x”键五秒钟,所以当我在记事本中运行它时,会看起来像这样: xxxxxxxxxxxxx
。 我在网上尝试了不同的代码,到目前为止我能find的最好的东西是:
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]
Sendkey模块不能解决我的问题,因为它只允许你发送一个按键,而不是一个保持键按下的事件。 我知道过去使用它,但我真的想知道这是否可能与python和如何。 PS我正在使用Python的窗户
这段代码应该让你开始。 ctypes
被大量使用。 在底部,你会看到示例代码。
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_HARDWARD = 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 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()
如果你使用的是Windows的Python,那么你很有可能拥有win32api
模块,这个模块可以处理你的API。
>>> import win32api >>> import win32con >>> win32api.keybd_event(win32con.SHIFT_PRESSED, 0, win32con.KEYEVENTF_EXTENDEDKEY, 0) >>> HELLO
这有帮助吗? (ps你应该尽可能安装IPython,这对于实验来说是非常有帮助的)
我知道这个问题真的很老,但我find了一个很好的库: PyUserInput
。 我不知道如何在Windows下载它(很久以前,我还没有下载Windows的库)。 在Linux中很容易,只需下载点(如果你没有): sudo apt-get install pip
,然后sudo pip install pyuserinput
。 然后代码非常简单:
#imports the library from pykeyboard import PyKeyboard #import the sleep function from time import sleep #initialize the keyboard simulator keyboard = PyKeyboard() #presses the key keyboard.press_key('x') #waits five seconds before releasing the key sleep(5) #releases the key keyboard.release_key('x')
我已经修改了Noctis的答案来处理Unicode字符。
“简单的unicode键盘自动化窗口” https://gist.github.com/ubershmekel/4b414a66037feaea595b5f4e78220aad
上面的链接有一个要点,这是今天的要点:
# coding: utf-8 """ Simple unicode keyboard automation for windows Based off of http://stackoverflow.com/questions/11906925/python-simulate-keydown """ import ctypes import time import sys LONG = ctypes.c_long DWORD = ctypes.c_ulong ULONG_PTR = ctypes.POINTER(DWORD) WORD = ctypes.c_ushort INPUT_MOUSE = 0 INPUT_KEYBOARD = 1 INPUT_HARDWARE = 2 KEYEVENTF_EXTENDEDKEY = 0x0001 KEYEVENTF_KEYUP = 0x0002 KEYEVENTF_SCANCODE = 0x0008 KEYEVENTF_UNICODE = 0x0004 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 send_input(*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) def input_structure(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!') def keyboard_input(code, flags): return KEYBDINPUT(0, code, flags, 0, None) def keyboard_event(code, flags=KEYEVENTF_UNICODE): return input_structure(keyboard_input(code, flags)) def press(character): code = ord(character) send_input(keyboard_event(code)) send_input(keyboard_event(code, KEYEVENTF_KEYUP)) def main(): time.sleep(3) for char in u'O\nשש2E6UXoשש2E^uXh#:SHn&HQ': press(char) time.sleep(0.5) if __name__ == '__main__': main()