def _keyDown(key): """Performs a keyboard key press without the release. This will put that key in a held down state. NOTE: For some reason, this does not seem to cause key repeats like would happen if a keyboard key was held down on a text field. Args: key (str): The key to be pressed down. The valid names are listed in pyautogui.KEY_NAMES. Returns: None """ if key not in keyboardMapping or keyboardMapping[key] is None: return if type(key) == int: fake_input(_display, X.KeyPress, key) _display.sync() return needsShift = pyautogui.isShiftCharacter(key) if needsShift: fake_input(_display, X.KeyPress, keyboardMapping['shift']) fake_input(_display, X.KeyPress, keyboardMapping[key]) if needsShift: fake_input(_display, X.KeyRelease, keyboardMapping['shift']) _display.sync()
def _normalKeyEvent(key, upDown): assert upDown in ('up', 'down'), "upDown argument must be 'up' or 'down'" try: if pyautogui.isShiftCharacter(key): key_code = keyboardMapping[key.lower()] event = Quartz.CGEventCreateKeyboardEvent(None, keyboardMapping['shift'], upDown == 'down') Quartz.CGEventPost(Quartz.kCGHIDEventTap, event) # Tiny sleep to let OS X catch up on us pressing shift time.sleep(0.01) else: key_code = keyboardMapping[key] event = Quartz.CGEventCreateKeyboardEvent(None, key_code, upDown == 'down') Quartz.CGEventPost(Quartz.kCGHIDEventTap, event) time.sleep(0.01) # TODO - wait, is the shift key's keyup not done? # TODO - get rid of this try-except. except KeyError: raise RuntimeError("Key %s not implemented." % (key))
def _keyDown(key): """Performs a keyboard key press without the release. This will put that key in a held down state. NOTE: For some reason, this does not seem to cause key repeats like would happen if a keyboard key was held down on a text field. Args: key (str): The key to be pressed down. The valid names are listed in pyautogui.KEY_NAMES. Returns: None """ if key not in keyboardMapping or keyboardMapping[key] is None: return needsShift = pyautogui.isShiftCharacter(key) # 以下を追加 2018/06/09 press, typewriteの時に@, ^, : は # shiftが押されている時と同じ動作なので入力文字が変更される if key == '@': needsShift = False if key == '^': needsShift = False if key == ':': needsShift = False """ # OLD CODE: The new code relies on having all keys be loaded in keyboardMapping from the start. if key in keyboardMapping.keys(): vkCode = keyboardMapping[key] elif len(key) == 1: # note: I could use this case to update keyboardMapping to cache the VkKeyScan results, but I've decided not to just to make any possible bugs easier to reproduce. vkCode = ctypes.windll.user32.VkKeyScanW(ctypes.wintypes.WCHAR(key)) if vkCode == -1: raise ValueError('There is no VK code for key "%s"' % (key)) if vkCode > 0x100: # the vk code will be > 0x100 if it needs shift vkCode -= 0x100 needsShift = True """ mods, vkCode = divmod(keyboardMapping[key], 0x100) for apply_mod, vk_mod in [(mods & 4, 0x12), (mods & 2, 0x11), (mods & 1 or needsShift, 0x10)]: #HANKAKU not suported! mods & 8 if apply_mod: ctypes.windll.user32.keybd_event(vk_mod, 0, 0, 0) # ctypes.windll.user32.keybd_event(vkCode, 0, 0, 0) for apply_mod, vk_mod in [(mods & 1 or needsShift, 0x10), (mods & 2, 0x11), (mods & 4, 0x12)]: #HANKAKU not suported! mods & 8 if apply_mod: ctypes.windll.user32.keybd_event(vk_mod, 0, KEYEVENTF_KEYUP, 0) #
def _keyDown(key): """Performs a keyboard key press without the release. This will put that key in a held down state. NOTE: For some reason, this does not seem to cause key repeats like would happen if a keyboard key was held down on a text field. Args: key (str): The key to be pressed down. The valid names are listed in pyautogui.KEY_NAMES. Returns: None """ if keyboardMapping.get(key) is None: return needsShift = pyautogui.isShiftCharacter(key) """ # OLD CODE: The new code relies on having all keys be loaded in keyboardMapping from the start. if key in keyboardMapping.keys(): vkCode = keyboardMapping[key] elif len(key) == 1: # note: I could use this case to update keyboardMapping to cache the VkKeyScan results, but I've decided not to just to make any possible bugs easier to reproduce. vkCode = ctypes.windll.user32.VkKeyScanW(ctypes.wintypes.WCHAR(key)) if vkCode == -1: raise ValueError('There is no VK code for key "%s"' % (key)) if vkCode > 0x100: # the vk code will be > 0x100 if it needs shift vkCode -= 0x100 needsShift = True """ vkCode = keyboardMapping[key] if vkCode > 0x100: # the vk code will be > 0x100 if it needs shift vkCode -= 0x100 needsShift = True if needsShift: ctypes.windll.user32.keybd_event(0x10, 0, 0, 0) # 0x10 is VK_SHIFT ctypes.windll.user32.keybd_event(vkCode, 0, 0, 0) if needsShift: ctypes.windll.user32.keybd_event(0x10, 0, KEYEVENTF_KEYUP, 0) # 0x10 is VK_SHIFT
def _keyDown(key): """Performs a keyboard key press without the release. This will put that key in a held down state. NOTE: For some reason, this does not seem to cause key repeats like would happen if a keyboard key was held down on a text field. Args: key (str): The key to be pressed down. The valid names are listed in pyautogui.KEY_NAMES. Returns: None """ if key not in keyboardMapping or keyboardMapping[key] is None: return needsShift = pyautogui.isShiftCharacter(key) """ # OLD CODE: The new code relies on having all keys be loaded in keyboardMapping from the start. if key in keyboardMapping.keys(): vkCode = keyboardMapping[key] elif len(key) == 1: # note: I could use this case to update keyboardMapping to cache the VkKeyScan results, but I've decided not to just to make any possible bugs easier to reproduce. vkCode = ctypes.windll.user32.VkKeyScanW(ctypes.wintypes.WCHAR(key)) if vkCode == -1: raise ValueError('There is no VK code for key "%s"' % (key)) if vkCode > 0x100: # the vk code will be > 0x100 if it needs shift vkCode -= 0x100 needsShift = True """ vkCode = keyboardMapping[key] if vkCode > 0x100: # the vk code will be > 0x100 if it needs shift vkCode -= 0x100 needsShift = True if needsShift: ctypes.windll.user32.keybd_event(0x10, 0, 0, 0) # 0x10 is VK_SHIFT ctypes.windll.user32.keybd_event(vkCode, 0, 0, 0) if needsShift: ctypes.windll.user32.keybd_event(0x10, 0, KEYEVENTF_KEYUP, 0) # 0x10 is VK_SHIFT
def _keyUp(key): """Performs a keyboard key release (without the press down beforehand). Args: key (str): The key to be released up. The valid names are listed in pyautogui.KEY_NAMES. Returns: None """ if key not in keyboardMapping or keyboardMapping[key] is None: return needsShift = pyautogui.isShiftCharacter(key) """ # OLD CODE: The new code relies on having all keys be loaded in keyboardMapping from the start. if key in keyboardMapping.keys(): vkCode = keyboardMapping[key] elif len(key) == 1: # note: I could use this case to update keyboardMapping to cache the VkKeyScan results, but I've decided not to just to make any possible bugs easier to reproduce. vkCode = ctypes.windll.user32.VkKeyScanW(ctypes.wintypes.WCHAR(key)) if vkCode == -1: raise ValueError('There is no VK code for key "%s"' % (key)) if vkCode > 0x100: # the vk code will be > 0x100 if it needs shift vkCode -= 0x100 needsShift = True """ mods, vkCode = divmod(keyboardMapping[key], 0x100) for apply_mod, vk_mod in [(mods & 4, 0x12), (mods & 2, 0x11), (mods & 1 or needsShift, 0x10) ]: #HANKAKU not suported! mods & 8 if apply_mod: ctypes.windll.user32.keybd_event(vk_mod, 0, 0, 0) # ctypes.windll.user32.keybd_event(vkCode, MapVirtualKey(vkCode, 0), KEYEVENTF_KEYUP, 0) for apply_mod, vk_mod in [(mods & 1 or needsShift, 0x10), (mods & 2, 0x11), (mods & 4, 0x12) ]: #HANKAKU not suported! mods & 8 if apply_mod: ctypes.windll.user32.keybd_event(vk_mod, 0, KEYEVENTF_KEYUP, 0) #
def _keyDown(key): """Performs a keyboard key press without the release. This will put that key in a held down state. NOTE: For some reason, this does not seem to cause key repeats like would happen if a keyboard key was held down on a text field. Args: key (str): The key to be pressed down. The valid names are listed in pyautogui.KEY_NAMES. Returns: None """ print("Direct input") if key not in keyboardMapping or keyboardMapping[key] is None: return needsShift = pyautogui.isShiftCharacter(key) keyCode = keyboardMapping[key] if keyCode >= 1024: keyCode = keyCode-1024 flags = 0x0008 | 0x0001 else: flags = 0x0008 if needsShift: _keyDown('shift') extra = ctypes.c_ulong(0) ii_ = INPUT_I() ii_.ki = KEYBDINPUT(0, keyCode, flags, 0, ctypes.pointer(extra)) x = INPUT(ctypes.c_ulong(1), ii_) ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x)) if needsShift: _keyUp('shift')
def _keyUp(key): """Performs a keyboard key release (without the press down beforehand). Args: key (str): The key to be released up. The valid names are listed in pyautogui.KEY_NAMES. Returns: None """ if key not in keyboardMapping or keyboardMapping[key] is None: return needsShift = pyautogui.isShiftCharacter(key) """ # OLD CODE: The new code relies on having all keys be loaded in keyboardMapping from the start. if key in keyboardMapping.keys(): vkCode = keyboardMapping[key] elif len(key) == 1: # note: I could use this case to update keyboardMapping to cache the VkKeyScan results, but I've decided not to just to make any possible bugs easier to reproduce. vkCode = ctypes.windll.user32.VkKeyScanW(ctypes.wintypes.WCHAR(key)) if vkCode == -1: raise ValueError('There is no VK code for key "%s"' % (key)) if vkCode > 0x100: # the vk code will be > 0x100 if it needs shift vkCode -= 0x100 needsShift = True """ mods, vkCode = divmod(keyboardMapping[key], 0x100) for apply_mod, vk_mod in [(mods & 4, 0x12), (mods & 2, 0x11), (mods & 1 or needsShift, 0x10)]: #HANKAKU not suported! mods & 8 if apply_mod: ctypes.windll.user32.keybd_event(vk_mod, 0, 0, 0) # ctypes.windll.user32.keybd_event(vkCode, 0, KEYEVENTF_KEYUP, 0) for apply_mod, vk_mod in [(mods & 1 or needsShift, 0x10), (mods & 2, 0x11), (mods & 4, 0x12)]: #HANKAKU not suported! mods & 8 if apply_mod: ctypes.windll.user32.keybd_event(vk_mod, 0, KEYEVENTF_KEYUP, 0) #
def _keyUp(key): """Performs a keyboard key release (without the press down beforehand). Args: key (str): The key to be released up. The valid names are listed in pyautogui.KEY_NAMES. Returns: None """ if key not in keyboardMapping or keyboardMapping[key] is None: return needsShift = pyautogui.isShiftCharacter(key) """ # OLD CODE: The new code relies on having all keys be loaded in keyboardMapping from the start. if key in keyboardMapping.keys(): vkCode = keyboardMapping[key] elif len(key) == 1: # note: I could use this case to update keyboardMapping to cache the VkKeyScan results, but I've decided not to just to make any possible bugs easier to reproduce. vkCode = ctypes.windll.user32.VkKeyScanW(ctypes.wintypes.WCHAR(key)) if vkCode == -1: raise ValueError('There is no VK code for key "%s"' % (key)) if vkCode > 0x100: # the vk code will be > 0x100 if it needs shift vkCode -= 0x100 needsShift = True """ vkCode = keyboardMapping[key] if vkCode > 0x100: # the vk code will be > 0x100 if it needs shift vkCode -= 0x100 needsShift = True # Not sure why shift is being pressed on a key *release*. Commenting these sections out. #if needsShift: # ctypes.windll.user32.keybd_event(0x10, 0, 0, 0) # 0x10 is VK_SHIFT key_up = INPUT(type=INPUT_KEYBOARD, ki=KEYBDINPUT(wVk=vkCode, dwFlags=KEYEVENTF_KEYUP)) ctypes.windll.user32.SendInput(1, ctypes.byref(key_up), ctypes.sizeof(key_up))
def test_isShiftCharacter(self): for char in "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + '~!@#$%^&*()_+{}|:"<>?': self.assertTrue(pyautogui.isShiftCharacter(char)) for char in "abcdefghijklmnopqrstuvwxyz" + " `1234567890-=,./;'[]\\": self.assertFalse(pyautogui.isShiftCharacter(char))