krótkie podsumowanie:
Próbuję stworzyć program, który będzie wysyłał zdarzenia klawiatury do komputera, które dla wszystkich celów symulowane zdarzenia powinny być traktowane jako rzeczywiste naciśnięcia klawiszy na klawiaturze.
oryginalny post:
Szukam sposobu na generowanie zdarzeń klawiatury za pomocą Pythona.
Załóżmy, że funkcja otrzymuje klawisz, który musi symulować naciśnięcie, na przykład:
keyboardevent('a') #lower case 'a'
keyboardevent('B') #upper case 'B'
keyboardevent('->') # right arrow key
def keyboardevent(key):
#code that simulated 'key' being pressed on keyboard
Powyższe są oczywiście przykładami, ale to, czego szukam, to biblioteka, moduł lub cokolwiek innego, czego mogę użyć do symulacji zdarzeń klawiatury.
Uwaga : Różni się to od wysyłania znaków do notatników lub wprowadzania tekstu do pól itp. Chcę, aby skrypt w Pythonie symulował rzeczywiste zdarzenie klawiatury, komputer pomyśli, że naprawdę jest zdarzenie klawiatury.
Dodatkowa uwaga:
Nie chcę wysyłać naciśnięć klawiszy do aktywnego okna - chcę, aby system wierzył, że klawisze klawiatury są naciskane, subtelna różnica, ponieważ niektóre aktywne okna nie akceptują pewnych kombinacji klawiszy lub gdybym chciał użyć skrótów klawiaturowych w przypadku procesów w tle za pośrednictwem mojego skryptu nie muszą one przechodzić przez aktywne okno
Do tej pory przyjrzałem się tym rzeczom:
Generuj zdarzenia klawiatury dla pierwszej aplikacji
Jak wygenerować zdarzenia naciśnięcia klawiszy za pomocą Pythona?
Które dotyczyły jabłka i wcale nie pomogły.
I to:
Jaki jest najłatwiejszy sposób symulacji klawiatury i myszy w Pythonie?
Wydaje się, że może to być to, czego potrzebuję, ale nie mogę znaleźć biblioteki ani żadnej dokumentacji.
Szukałem też więcej miejsc, ale jeszcze nie znalazłem rozwiązania.
źródło
X
platform jest,xdotool
ale zwykle nie jest instalowany domyślnie. Uważam, że przeczytanie dokumentacjiX
nie powinno być trudne do napisania minimalnego modułu w C, który robi to, co chcesz (wydaje mi się, żexsendkeys
jakiś czas temu istniał program).Odpowiedzi:
Można to zrobić za pomocą ctypów:
import ctypes from ctypes import wintypes import time user32 = ctypes.WinDLL('user32', use_last_error=True) INPUT_MOUSE = 0 INPUT_KEYBOARD = 1 INPUT_HARDWARE = 2 KEYEVENTF_EXTENDEDKEY = 0x0001 KEYEVENTF_KEYUP = 0x0002 KEYEVENTF_UNICODE = 0x0004 KEYEVENTF_SCANCODE = 0x0008 MAPVK_VK_TO_VSC = 0 # msdn.microsoft.com/en-us/library/dd375731 VK_TAB = 0x09 VK_MENU = 0x12 # C struct definitions wintypes.ULONG_PTR = wintypes.WPARAM class MOUSEINPUT(ctypes.Structure): _fields_ = (("dx", wintypes.LONG), ("dy", wintypes.LONG), ("mouseData", wintypes.DWORD), ("dwFlags", wintypes.DWORD), ("time", wintypes.DWORD), ("dwExtraInfo", wintypes.ULONG_PTR)) class KEYBDINPUT(ctypes.Structure): _fields_ = (("wVk", wintypes.WORD), ("wScan", wintypes.WORD), ("dwFlags", wintypes.DWORD), ("time", wintypes.DWORD), ("dwExtraInfo", wintypes.ULONG_PTR)) def __init__(self, *args, **kwds): super(KEYBDINPUT, self).__init__(*args, **kwds) # some programs use the scan code even if KEYEVENTF_SCANCODE # isn't set in dwFflags, so attempt to map the correct code. if not self.dwFlags & KEYEVENTF_UNICODE: self.wScan = user32.MapVirtualKeyExW(self.wVk, MAPVK_VK_TO_VSC, 0) class HARDWAREINPUT(ctypes.Structure): _fields_ = (("uMsg", wintypes.DWORD), ("wParamL", wintypes.WORD), ("wParamH", wintypes.WORD)) class INPUT(ctypes.Structure): class _INPUT(ctypes.Union): _fields_ = (("ki", KEYBDINPUT), ("mi", MOUSEINPUT), ("hi", HARDWAREINPUT)) _anonymous_ = ("_input",) _fields_ = (("type", wintypes.DWORD), ("_input", _INPUT)) LPINPUT = ctypes.POINTER(INPUT) def _check_count(result, func, args): if result == 0: raise ctypes.WinError(ctypes.get_last_error()) return args user32.SendInput.errcheck = _check_count user32.SendInput.argtypes = (wintypes.UINT, # nInputs LPINPUT, # pInputs ctypes.c_int) # cbSize # Functions def PressKey(hexKeyCode): x = INPUT(type=INPUT_KEYBOARD, ki=KEYBDINPUT(wVk=hexKeyCode)) user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x)) def ReleaseKey(hexKeyCode): x = INPUT(type=INPUT_KEYBOARD, ki=KEYBDINPUT(wVk=hexKeyCode, dwFlags=KEYEVENTF_KEYUP)) user32.SendInput(1, ctypes.byref(x), ctypes.sizeof(x)) def AltTab(): """Press Alt+Tab and hold Alt key for 2 seconds in order to see the overlay. """ PressKey(VK_MENU) # Alt PressKey(VK_TAB) # Tab ReleaseKey(VK_TAB) # Tab~ time.sleep(2) ReleaseKey(VK_MENU) # Alt~ if __name__ == "__main__": AltTab()
hexKeyCode
to mapowanie klawiatury wirtualnej zdefiniowane przez interfejs API systemu Windows. Lista kodów jest dostępna w witrynie MSDN: Kody klucza wirtualnego (Windows)źródło
Zarówno dla python3, jak i python2 możesz użyć
pyautogui
(pip install pyautogui
)from pyautogui import press, typewrite, hotkey press('a') typewrite('quick brown fox') hotkey('ctrl', 'w')
Jest również wieloplatformowy z systemami Windows, OSX i Ubuntu LTS.
źródło
press
działa również z klawiszami multimedialnymi. Używam go do wyciszania komputerapress('volumemute')
Pomysł użytkownika648852 przynajmniej dla mnie działa świetnie na OS X, oto kod, aby to zrobić:
#!/usr/bin/env python import time from Quartz.CoreGraphics import CGEventCreateKeyboardEvent from Quartz.CoreGraphics import CGEventPost # Python releases things automatically, using CFRelease will result in a scary error #from Quartz.CoreGraphics import CFRelease from Quartz.CoreGraphics import kCGHIDEventTap # From http://stackoverflow.com/questions/281133/controlling-the-mouse-from-python-in-os-x # and from https://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/index.html#//apple_ref/c/func/CGEventCreateKeyboardEvent def KeyDown(k): keyCode, shiftKey = toKeyCode(k) time.sleep(0.0001) if shiftKey: CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, True)) time.sleep(0.0001) CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, True)) time.sleep(0.0001) if shiftKey: CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, False)) time.sleep(0.0001) def KeyUp(k): keyCode, shiftKey = toKeyCode(k) time.sleep(0.0001) CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, False)) time.sleep(0.0001) def KeyPress(k): keyCode, shiftKey = toKeyCode(k) time.sleep(0.0001) if shiftKey: CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, True)) time.sleep(0.0001) CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, True)) time.sleep(0.0001) CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, False)) time.sleep(0.0001) if shiftKey: CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, False)) time.sleep(0.0001) # From http://stackoverflow.com/questions/3202629/where-can-i-find-a-list-of-mac-virtual-key-codes def toKeyCode(c): shiftKey = False # Letter if c.isalpha(): if not c.islower(): shiftKey = True c = c.lower() if c in shiftChars: shiftKey = True c = shiftChars[c] if c in keyCodeMap: keyCode = keyCodeMap[c] else: keyCode = ord(c) return keyCode, shiftKey shiftChars = { '~': '`', '!': '1', '@': '2', '#': '3', '$': '4', '%': '5', '^': '6', '&': '7', '*': '8', '(': '9', ')': '0', '_': '-', '+': '=', '{': '[', '}': ']', '|': '\\', ':': ';', '"': '\'', '<': ',', '>': '.', '?': '/' } keyCodeMap = { 'a' : 0x00, 's' : 0x01, 'd' : 0x02, 'f' : 0x03, 'h' : 0x04, 'g' : 0x05, 'z' : 0x06, 'x' : 0x07, 'c' : 0x08, 'v' : 0x09, 'b' : 0x0B, 'q' : 0x0C, 'w' : 0x0D, 'e' : 0x0E, 'r' : 0x0F, 'y' : 0x10, 't' : 0x11, '1' : 0x12, '2' : 0x13, '3' : 0x14, '4' : 0x15, '6' : 0x16, '5' : 0x17, '=' : 0x18, '9' : 0x19, '7' : 0x1A, '-' : 0x1B, '8' : 0x1C, '0' : 0x1D, ']' : 0x1E, 'o' : 0x1F, 'u' : 0x20, '[' : 0x21, 'i' : 0x22, 'p' : 0x23, 'l' : 0x25, 'j' : 0x26, '\'' : 0x27, 'k' : 0x28, ';' : 0x29, '\\' : 0x2A, ',' : 0x2B, '/' : 0x2C, 'n' : 0x2D, 'm' : 0x2E, '.' : 0x2F, '`' : 0x32, 'k.' : 0x41, 'k*' : 0x43, 'k+' : 0x45, 'kclear' : 0x47, 'k/' : 0x4B, 'k\n' : 0x4C, 'k-' : 0x4E, 'k=' : 0x51, 'k0' : 0x52, 'k1' : 0x53, 'k2' : 0x54, 'k3' : 0x55, 'k4' : 0x56, 'k5' : 0x57, 'k6' : 0x58, 'k7' : 0x59, 'k8' : 0x5B, 'k9' : 0x5C, # keycodes for keys that are independent of keyboard layout '\n' : 0x24, '\t' : 0x30, ' ' : 0x31, 'del' : 0x33, 'delete' : 0x33, 'esc' : 0x35, 'escape' : 0x35, 'cmd' : 0x37, 'command' : 0x37, 'shift' : 0x38, 'caps lock' : 0x39, 'option' : 0x3A, 'ctrl' : 0x3B, 'control' : 0x3B, 'right shift' : 0x3C, 'rshift' : 0x3C, 'right option' : 0x3D, 'roption' : 0x3D, 'right control' : 0x3E, 'rcontrol' : 0x3E, 'fun' : 0x3F, 'function' : 0x3F, 'f17' : 0x40, 'volume up' : 0x48, 'volume down' : 0x49, 'mute' : 0x4A, 'f18' : 0x4F, 'f19' : 0x50, 'f20' : 0x5A, 'f5' : 0x60, 'f6' : 0x61, 'f7' : 0x62, 'f3' : 0x63, 'f8' : 0x64, 'f9' : 0x65, 'f11' : 0x67, 'f13' : 0x69, 'f16' : 0x6A, 'f14' : 0x6B, 'f10' : 0x6D, 'f12' : 0x6F, 'f15' : 0x71, 'help' : 0x72, 'home' : 0x73, 'pgup' : 0x74, 'page up' : 0x74, 'forward delete' : 0x75, 'f4' : 0x76, 'end' : 0x77, 'f2' : 0x78, 'page down' : 0x79, 'pgdn' : 0x79, 'f1' : 0x7A, 'left' : 0x7B, 'right' : 0x7C, 'down' : 0x7D, 'up' : 0x7E }
źródło
Wypróbowałem klawiaturę lib i działa dobrze w systemie Windows. Poniższy wiersz pomaga mi przełączać karty w przeglądarce:
keyboard.press_and_release('ctrl+tab')
źródło
Miałem ten sam problem i stworzyłem dla niego własną bibliotekę, która używa ctypów:
""" < --- CTRL by [object Object] --- > Only works on windows. Some characters only work with a US standard keyboard. Some parts may also only work in python 32-bit. """ #--- Setup ---# from ctypes import * from time import sleep user32 = windll.user32 kernel32 = windll.kernel32 delay = 0.01 #################################### ###---KEYBOARD CONTROL SECTION---### #################################### #--- Key Code Variables ---# class key: cancel = 0x03 backspace = 0x08 tab = 0x09 enter = 0x0D shift = 0x10 ctrl = 0x11 alt = 0x12 capslock = 0x14 esc = 0x1B space = 0x20 pgup = 0x21 pgdown = 0x22 end = 0x23 home = 0x24 leftarrow = 0x26 uparrow = 0x26 rightarrow = 0x27 downarrow = 0x28 select = 0x29 print = 0x2A execute = 0x2B printscreen = 0x2C insert = 0x2D delete = 0x2E help = 0x2F num0 = 0x30 num1 = 0x31 num2 = 0x32 num3 = 0x33 num4 = 0x34 num5 = 0x35 num6 = 0x36 num7 = 0x37 num8 = 0x38 num9 = 0x39 a = 0x41 b = 0x42 c = 0x43 d = 0x44 e = 0x45 f = 0x46 g = 0x47 h = 0x48 i = 0x49 j = 0x4A k = 0x4B l = 0x4C m = 0x4D n = 0x4E o = 0x4F p = 0x50 q = 0x51 r = 0x52 s = 0x53 t = 0x54 u = 0x55 v = 0x56 w = 0x57 x = 0x58 y = 0x59 z = 0x5A leftwin = 0x5B rightwin = 0x5C apps = 0x5D sleep = 0x5F numpad0 = 0x60 numpad1 = 0x61 numpad3 = 0x63 numpad4 = 0x64 numpad5 = 0x65 numpad6 = 0x66 numpad7 = 0x67 numpad8 = 0x68 numpad9 = 0x69 multiply = 0x6A add = 0x6B seperator = 0x6C subtract = 0x6D decimal = 0x6E divide = 0x6F F1 = 0x70 F2 = 0x71 F3 = 0x72 F4 = 0x73 F5 = 0x74 F6 = 0x75 F7 = 0x76 F8 = 0x77 F9 = 0x78 F10 = 0x79 F11 = 0x7A F12 = 0x7B F13 = 0x7C F14 = 0x7D F15 = 0x7E F16 = 0x7F F17 = 0x80 F19 = 0x82 F20 = 0x83 F21 = 0x84 F22 = 0x85 F23 = 0x86 F24 = 0x87 numlock = 0x90 scrolllock = 0x91 leftshift = 0xA0 rightshift = 0xA1 leftctrl = 0xA2 rightctrl = 0xA3 leftmenu = 0xA4 rightmenu = 0xA5 browserback = 0xA6 browserforward = 0xA7 browserrefresh = 0xA8 browserstop = 0xA9 browserfavories = 0xAB browserhome = 0xAC volumemute = 0xAD volumedown = 0xAE volumeup = 0xAF nexttrack = 0xB0 prevoustrack = 0xB1 stopmedia = 0xB2 playpause = 0xB3 launchmail = 0xB4 selectmedia = 0xB5 launchapp1 = 0xB6 launchapp2 = 0xB7 semicolon = 0xBA equals = 0xBB comma = 0xBC dash = 0xBD period = 0xBE slash = 0xBF accent = 0xC0 openingsquarebracket = 0xDB backslash = 0xDC closingsquarebracket = 0xDD quote = 0xDE play = 0xFA zoom = 0xFB PA1 = 0xFD clear = 0xFE #--- Keyboard Control Functions ---# # Category variables letters = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" shiftsymbols = "~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:\"ZXCVBNM<>?" # Presses and releases the key def press(key): user32.keybd_event(key, 0, 0, 0) sleep(delay) user32.keybd_event(key, 0, 2, 0) sleep(delay) # Holds a key def hold(key): user32.keybd_event(key, 0, 0, 0) sleep(delay) # Releases a key def release(key): user32.keybd_event(key, 0, 2, 0) sleep(delay) # Types out a string def typestr(sentence): for letter in sentence: shift = letter in shiftsymbols fixedletter = "space" if letter == "`" or letter == "~": fixedletter = "accent" elif letter == "1" or letter == "!": fixedletter = "num1" elif letter == "2" or letter == "@": fixedletter = "num2" elif letter == "3" or letter == "#": fixedletter = "num3" elif letter == "4" or letter == "$": fixedletter = "num4" elif letter == "5" or letter == "%": fixedletter = "num5" elif letter == "6" or letter == "^": fixedletter = "num6" elif letter == "7" or letter == "&": fixedletter = "num7" elif letter == "8" or letter == "*": fixedletter = "num8" elif letter == "9" or letter == "(": fixedletter = "num9" elif letter == "0" or letter == ")": fixedletter = "num0" elif letter == "-" or letter == "_": fixedletter = "dash" elif letter == "=" or letter == "+": fixedletter = "equals" elif letter in letters: fixedletter = letter.lower() elif letter == "[" or letter == "{": fixedletter = "openingsquarebracket" elif letter == "]" or letter == "}": fixedletter = "closingsquarebracket" elif letter == "\\" or letter == "|": fixedletter == "backslash" elif letter == ";" or letter == ":": fixedletter = "semicolon" elif letter == "'" or letter == "\"": fixedletter = "quote" elif letter == "," or letter == "<": fixedletter = "comma" elif letter == "." or letter == ">": fixedletter = "period" elif letter == "/" or letter == "?": fixedletter = "slash" elif letter == "\n": fixedletter = "enter" keytopress = eval("key." + str(fixedletter)) if shift: hold(key.shift) press(keytopress) release(key.shift) else: press(keytopress) #--- Mouse Variables ---# class mouse: left = [0x0002, 0x0004] right = [0x0008, 0x00010] middle = [0x00020, 0x00040] #--- Mouse Control Functions ---# # Moves mouse to a position def move(x, y): user32.SetCursorPos(x, y) # Presses and releases mouse def click(button): user32.mouse_event(button[0], 0, 0, 0, 0) sleep(delay) user32.mouse_event(button[1], 0, 0, 0, 0) sleep(delay) # Holds a mouse button def holdclick(button): user32.mouse_event(button[0], 0, 0, 0, 0) sleep(delay) # Releases a mouse button def releaseclick(button): user32.mouse_event(button[1]) sleep(delay)
źródło
System operacyjny Mac
Oto pełniejsza wersja odpowiedzi @Phylliida w formie zajęć z przykładowym kodem:
#!/usr/bin/python # Script simulating keyboard events in macOS. # See: https://stackoverflow.com/q/13564851/55075 import sys import time from Quartz.CoreGraphics import CGEventCreateKeyboardEvent from Quartz.CoreGraphics import CGEventPost from Quartz.CoreGraphics import kCGHIDEventTap #from Quartz.CoreGraphics import CFRelease # Python releases things automatically. class Keyboard(): shiftChars = { '~': '`', '!': '1', '@': '2', '#': '3', '$': '4', '%': '5', '^': '6', '&': '7', '*': '8', '(': '9', ')': '0', '_': '-', '+': '=', '{': '[', '}': ']', '|': '\\', ':': ';', '"': '\'', '<': ',', '>': '.', '?': '/' } keyCodeMap = { 'a' : 0x00, 's' : 0x01, 'd' : 0x02, 'f' : 0x03, 'h' : 0x04, 'g' : 0x05, 'z' : 0x06, 'x' : 0x07, 'c' : 0x08, 'v' : 0x09, 'b' : 0x0B, 'q' : 0x0C, 'w' : 0x0D, 'e' : 0x0E, 'r' : 0x0F, 'y' : 0x10, 't' : 0x11, '1' : 0x12, '2' : 0x13, '3' : 0x14, '4' : 0x15, '6' : 0x16, '5' : 0x17, '=' : 0x18, '9' : 0x19, '7' : 0x1A, '-' : 0x1B, '8' : 0x1C, '0' : 0x1D, ']' : 0x1E, 'o' : 0x1F, 'u' : 0x20, '[' : 0x21, 'i' : 0x22, 'p' : 0x23, 'l' : 0x25, 'j' : 0x26, '\'' : 0x27, 'k' : 0x28, ';' : 0x29, '\\' : 0x2A, ',' : 0x2B, '/' : 0x2C, 'n' : 0x2D, 'm' : 0x2E, '.' : 0x2F, '`' : 0x32, 'k.' : 0x41, 'k*' : 0x43, 'k+' : 0x45, 'kclear' : 0x47, 'k/' : 0x4B, 'k\n' : 0x4C, 'k-' : 0x4E, 'k=' : 0x51, 'k0' : 0x52, 'k1' : 0x53, 'k2' : 0x54, 'k3' : 0x55, 'k4' : 0x56, 'k5' : 0x57, 'k6' : 0x58, 'k7' : 0x59, 'k8' : 0x5B, 'k9' : 0x5C, # keycodes for keys that are independent of keyboard layout '\n' : 0x24, '\t' : 0x30, ' ' : 0x31, 'del' : 0x33, 'delete' : 0x33, 'esc' : 0x35, 'escape' : 0x35, 'cmd' : 0x37, 'command' : 0x37, 'shift' : 0x38, 'caps lock' : 0x39, 'option' : 0x3A, 'ctrl' : 0x3B, 'control' : 0x3B, 'right shift' : 0x3C, 'rshift' : 0x3C, 'right option' : 0x3D, 'roption' : 0x3D, 'right control' : 0x3E, 'rcontrol' : 0x3E, 'fun' : 0x3F, 'function' : 0x3F, 'f17' : 0x40, 'volume up' : 0x48, 'volume down' : 0x49, 'mute' : 0x4A, 'f18' : 0x4F, 'f19' : 0x50, 'f20' : 0x5A, 'f5' : 0x60, 'f6' : 0x61, 'f7' : 0x62, 'f3' : 0x63, 'f8' : 0x64, 'f9' : 0x65, 'f11' : 0x67, 'f13' : 0x69, 'f16' : 0x6A, 'f14' : 0x6B, 'f10' : 0x6D, 'f12' : 0x6F, 'f15' : 0x71, 'help' : 0x72, 'home' : 0x73, 'pgup' : 0x74, 'page up' : 0x74, 'forward delete' : 0x75, 'f4' : 0x76, 'end' : 0x77, 'f2' : 0x78, 'page down' : 0x79, 'pgdn' : 0x79, 'f1' : 0x7A, 'left' : 0x7B, 'right' : 0x7C, 'down' : 0x7D, 'up' : 0x7E } # See: https://stackoverflow.com/q/3202629/55075 def toKeyCode(self, c): shiftKey = False # Letter if c.isalpha(): if not c.islower(): shiftKey = True c = c.lower() if c in Keyboard.shiftChars: shiftKey = True c = Keyboard.shiftChars[c] if c in Keyboard.keyCodeMap: keyCode = Keyboard.keyCodeMap[c] else: keyCode = ord(c) return keyCode, shiftKey def KeyDown(self, k): keyCode, shiftKey = self.toKeyCode(k) time.sleep(0.0001) if shiftKey: CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, True)) time.sleep(0.0001) CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, True)) time.sleep(0.0001) if shiftKey: CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, False)) time.sleep(0.0001) def KeyUp(self, k): keyCode, shiftKey = self.toKeyCode(k) time.sleep(0.0001) CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, False)) time.sleep(0.0001) def KeyPress(self, k): keyCode, shiftKey = self.toKeyCode(k) time.sleep(0.0001) if shiftKey: CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, True)) time.sleep(0.0001) CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, True)) time.sleep(0.0001) CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, keyCode, False)) time.sleep(0.0001) if shiftKey: CGEventPost(kCGHIDEventTap, CGEventCreateKeyboardEvent(None, 0x38, False)) time.sleep(0.0001) def Type(self, text): for key in text: self.KeyDown(key) self.KeyUp(key)
Oto kod demonstracyjny wykorzystujący powyższą klasę:
# DEMO if __name__ == '__main__': keyboard = Keyboard() if sys.platform == "darwin": keyboard.Type('Hello World!') elif sys.platform == "win32": print("Error: Platform not supported!")
który będzie symulował wpisywanie
Hello World!
tekstu w bieżącym oknie.Możesz uruchomić powyższy kod jako skrypt powłoki. Sprawdź łącze do
keyboard.py
pliku .źródło
Każda platforma będzie miała inne podejście do możliwości generowania zdarzeń klawiatury. Dzieje się tak, ponieważ każdy z nich musi korzystać z bibliotek systemowych (i rozszerzeń systemu). W przypadku rozwiązania wieloplatformowego należałoby wziąć każde z tych rozwiązań i zawinąć je do testu platformy, aby wykonać właściwe podejście.
W przypadku systemu Windows możesz użyć rozszerzenia pywin32 . win32api.keybd_event
Będziesz musiał zbadać pywin32, aby dowiedzieć się, jak prawidłowo go używać, ponieważ nigdy go nie używałem.
źródło
Tylko Windows: możesz użyć Ironpython lub biblioteki, która umożliwia cPythonowi dostęp do struktur .NET w systemie Windows. Następnie użyj klasy sendkeys platformy .NET lub bardziej ogólnej metody wysyłania, aby zasymulować naciśnięcie klawisza.
Tylko OS X: użyj PyObjC, a następnie użyj
CGEventCreateKeyboardEvent
połączenia.Pełne ujawnienie: zrobiłem to tylko na OS X z Pythonem, ale użyłem .NET sendkeys (z C #) i to działa świetnie.
źródło
python for .net
. aa rozwiązanie, jak użyłbym plikusendkeys
. czy mógłbyś podać przykład tego?Dla Pythona2.7 (windows32) zainstalowałem tylko pywin32-223 . I napisałem prosty kod w Pythonie:
import win32api import time import win32con # simulate the pressing-DOWN "ARROW key" of 200 times for i in range(200): time.sleep(0.5) win32api.keybd_event(0x28, 0,0,0) time.sleep(.05) win32api.keybd_event(0x28,0 ,win32con.KEYEVENTF_KEYUP ,0)
Można to sprawdzić, jeśli uruchomisz kod i od razu przejdziesz do okna notatnika (gdzie tekst już istnieje) i umieścisz kursor w górnej linii.
źródło
odnośnie kodu rekomendowanej odpowiedzi,
W przypadku mojego bota zalecana odpowiedź nie zadziałała. Dzieje się tak, ponieważ używam przeglądarki Chrome, która wymaga użycia KEYEVENTF_SCANCODE w moich dwFlags.
Aby jego kod działał, musiałem zmodyfikować te bloki kodu:
class KEYBDINPUT(ctypes.Structure): _fields_ = (("wVk", wintypes.WORD), ("wScan", wintypes.WORD), ("dwFlags", wintypes.DWORD), ("time", wintypes.DWORD), ("dwExtraInfo", wintypes.ULONG_PTR)) def __init__(self, *args, **kwds): super(KEYBDINPUT, self).__init__(*args, **kwds) # some programs use the scan code even if KEYEVENTF_SCANCODE # isn't set in dwFflags, so attempt to map the correct code. #if not self.dwFlags & KEYEVENTF_UNICODE:l #self.wScan = user32.MapVirtualKeyExW(self.wVk, #MAPVK_VK_TO_VSC, 0) # ^MAKE SURE YOU COMMENT/REMOVE THIS CODE^ def PressKey(keyCode): input = INPUT(type=INPUT_KEYBOARD, ki=KEYBDINPUT(wScan=keyCode, dwFlags=KEYEVENTF_SCANCODE)) user32.SendInput(1, ctypes.byref(input), ctypes.sizeof(input)) def ReleaseKey(keyCode): input = INPUT(type=INPUT_KEYBOARD, ki=KEYBDINPUT(wScan=keyCode, dwFlags=KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP)) user32.SendInput(1, ctypes.byref(input), ctypes.sizeof(input)) time.sleep(5) # sleep to open browser tab PressKey(0x26) # press right arrow key time.sleep(2) # hold for 2 seconds ReleaseKey(0x26) # release right arrow key
Mam nadzieję, że to pomaga komuś w bólu głowy!
źródło
def keyboardevent(): keyboard.press_and_release('a') keyboard.press_and_release('shift + b') keyboardevent()
źródło