from pyOpenRPA.Tools import CrossOS if CrossOS.IS_WINDOWS_BOOL: from keyboard import * elif CrossOS.IS_LINUX_BOOL: import pyautogui, sys, os press = pyautogui.keyDown release = pyautogui.keyUp def send(hotkey, do_press=True, do_release=True): if do_press and do_release: pyautogui.press(hotkey); return if do_press: press(hotkey) if do_release: release(hotkey) WIN = CrossOS.IS_WINDOWS_BOOL LIN = CrossOS.IS_LINUX_BOOL import time # Настройки модуля Keyboard WAIT_AFTER_SEC_FLOAT = 0.4 # Время, которое ожидать после выполнения любой операции модуля Keyboard. Настройка является единой для всех участов кода, использующих модуль Keyboard. Если для некоторой функции требуется изменить данное время ожидания, то в отношении этой функции можно применить соответсвующий аргумент. # ШЕСТНАДЦАТИРИЧНЫЙ СКАН-КОД В РУССКОЙ РАСКЛАДКЕ (НЕЗАВИСИМО ОТ ВЫБРАННОГО ЯЗЫКА НА КЛАВИАТУРЕ) # ОТОБРАЖЕНИЕ СКАН КОДОВ НА КЛАВИАТУРЕ https://snipp.ru/handbk/scan-codes KEY_RUS_LAYOUT = "ru" # NEED FOR LINUX (FOR LAYOUT SWITCH) KEY_RUS_Ф = 0x1E if WIN else 'a' #A KEY_RUS_И = 0x30 if WIN else 'b' #B KEY_RUS_С = 0x2E if WIN else 'c' #C KEY_RUS_В = 0x20 if WIN else 'd' #D KEY_RUS_У = 0x12 if WIN else 'e' #E KEY_RUS_А = 0x21 if WIN else 'f' #F KEY_RUS_П = 0x22 if WIN else 'g' #G KEY_RUS_Р = 0x23 if WIN else 'h' #H KEY_RUS_Ш = 0x17 if WIN else 'i' #I KEY_RUS_О = 0x24 if WIN else 'j' #J KEY_RUS_Л = 0x25 if WIN else 'k' #K KEY_RUS_Д = 0x26 if WIN else 'l' #L KEY_RUS_Ь = 0x32 if WIN else 'm' #M KEY_RUS_Т = 0x31 if WIN else 'n' #N KEY_RUS_Щ = 0x18 if WIN else 'o' #O KEY_RUS_З = 0x19 if WIN else 'p' #P KEY_RUS_Й = 0x10 if WIN else 'q' #Q KEY_RUS_К = 0x13 if WIN else 'r' #R KEY_RUS_Ы = 0x1F if WIN else 's' #S KEY_RUS_Е = 0x14 if WIN else 't' #T KEY_RUS_Г = 0x16 if WIN else 'u' #U KEY_RUS_М = 0x2F if WIN else 'v' #V KEY_RUS_Ц = 0x11 if WIN else 'w' #W KEY_RUS_Ч = 0x2D if WIN else 'x' #X KEY_RUS_Н = 0x15 if WIN else 'y' #Y KEY_RUS_Я = 0x2C if WIN else 'z' #Z KEY_RUS_Ё = 0x29 if WIN else '~' #~ KEY_RUS_Ж = 0x27 if WIN else ':' #: KEY_RUS_Б = 0x33 if WIN else '<' #< KEY_RUS_Ю = 0x34 if WIN else '>' #> KEY_RUS_Х = 0x1A if WIN else '[' #[ KEY_RUS_Ъ = 0x1B if WIN else ']' #] KEY_RUS_Э = 0x28 if WIN else "'" #' KEY_ENG_LAYOUT = "us" # NEED FOR LINUX (FOR LAYOUT SWITCH) KEY_ENG_A = 0x1E if WIN else 'a' #A KEY_ENG_B = 0x30 if WIN else 'b' #B KEY_ENG_C = 0x2E if WIN else 'c' #C KEY_ENG_D = 0x20 if WIN else 'd' #D KEY_ENG_E = 0x12 if WIN else 'e' #E KEY_ENG_F = 0x21 if WIN else 'f' #F KEY_ENG_G = 0x22 if WIN else 'g' #G KEY_ENG_H = 0x23 if WIN else 'h' #H KEY_ENG_I = 0x17 if WIN else 'i' #I KEY_ENG_J = 0x24 if WIN else 'j' #J KEY_ENG_K = 0x25 if WIN else 'k' #K KEY_ENG_L = 0x26 if WIN else 'l' #L KEY_ENG_M = 0x32 if WIN else 'm' #M KEY_ENG_N = 0x31 if WIN else 'n' #N KEY_ENG_O = 0x18 if WIN else 'o' #O KEY_ENG_P = 0x19 if WIN else 'p' #P KEY_ENG_Q = 0x10 if WIN else 'q' #Q KEY_ENG_R = 0x13 if WIN else 'r' #R KEY_ENG_S = 0x1F if WIN else 's' #S KEY_ENG_T = 0x14 if WIN else 't' #T KEY_ENG_U = 0x16 if WIN else 'u' #U KEY_ENG_V = 0x2F if WIN else 'v' #V KEY_ENG_W = 0x11 if WIN else 'w' #W KEY_ENG_X = 0x2D if WIN else 'x' #X KEY_ENG_Y = 0x15 if WIN else 'y' #Y KEY_ENG_Z = 0x2C if WIN else 'z' #Z KEY_ENG_TILDE = 0x29 if WIN else '~' #~ KEY_ENG_COLON = 0x27 if WIN else ':' #: KEY_ENG_PLUS = 0x0D if WIN else '+' #+ KEY_ENG_MINUS = 0x0C if WIN else '-' #- KEY_ENG_LESS_THAN = 0x33 if WIN else '<' #< , KEY_ENG_GREATER_THAN = 0x34 if WIN else '>' #> . KEY_ENG_SOLIDUS = 0x35 if WIN else '/' #/ ? KEY_ENG_SQUARE_BRACKET_LEFT = 0x1A if WIN else '[' #[ KEY_ENG_SQUARE_BRACKET_RIGHT = 0x1B if WIN else ']' #] KEY_ENG_APOSTROPHE = 0x28 if WIN else "'" #' " KEY_ENG_VERTICAL_LINE = 0x2B if WIN else '|' #| \ KEY_ENG_NUMPAD_0 = 0x52 if WIN else 'num0' KEY_ENG_NUMPAD_1 = 0x4F if WIN else 'num1' KEY_ENG_NUMPAD_2 = 0x50 if WIN else 'num2' KEY_ENG_NUMPAD_3 = 0x51 if WIN else 'num3' KEY_ENG_NUMPAD_4 = 0x4B if WIN else 'num4' KEY_ENG_NUMPAD_5 = 0x4C if WIN else 'num5' KEY_ENG_NUMPAD_6 = 0x4D if WIN else 'num6' KEY_ENG_NUMPAD_7 = 0x47 if WIN else 'num7' KEY_ENG_NUMPAD_8 = 0x48 if WIN else 'num8' KEY_ENG_NUMPAD_9 = 0x49 if WIN else 'num9' KEY_ENG_NUMPAD_ASTERISK = 0x37 if WIN else '*' #* KEY_ENG_NUMPAD_PLUS = 0x4E if WIN else '+' KEY_ENG_NUMPAD_MINUS = 0x4A if WIN else '-' KEY_ENG_NUMPAD_DELETE = 0x53 if WIN else 'delete' KEY_ENG_NUMPAD_SOLIDUS = 0x35 if WIN else '/' #/ KEY_ENG_NUMPAD_ENTER = 0x11c if WIN else 'enter' KEY_ENG_0 = 0xB if WIN else '0' KEY_ENG_1 = 0x2 if WIN else '1' KEY_ENG_2 = 0x3 if WIN else '2' KEY_ENG_3 = 0x4 if WIN else '3' KEY_ENG_4 = 0x5 if WIN else '4' KEY_ENG_5 = 0x6 if WIN else '5' KEY_ENG_6 = 0x7 if WIN else '6' KEY_ENG_7 = 0x8 if WIN else '7' KEY_ENG_8 = 0x9 if WIN else '8' KEY_ENG_9 = 0xA if WIN else '9' KEY_HOT_NUMPAD_0 = 0x52 if WIN else 'num0' KEY_HOT_NUMPAD_1 = 0x4F if WIN else 'num1' KEY_HOT_NUMPAD_2 = 0x50 if WIN else 'num2' KEY_HOT_NUMPAD_3 = 0x51 if WIN else 'num3' KEY_HOT_NUMPAD_4 = 0x4B if WIN else 'num4' KEY_HOT_NUMPAD_5 = 0x4C if WIN else 'num5' KEY_HOT_NUMPAD_6 = 0x4D if WIN else 'num6' KEY_HOT_NUMPAD_7 = 0x47 if WIN else 'num7' KEY_HOT_NUMPAD_8 = 0x48 if WIN else 'num8' KEY_HOT_NUMPAD_9 = 0x49 if WIN else 'num9' KEY_HOT_NUMPAD_ASTERISK = 0x37 if WIN else '*' #* KEY_HOT_NUMPAD_PLUS = 0x4E if WIN else '+' KEY_HOT_NUMPAD_MINUS = 0x4A if WIN else '-' KEY_HOT_NUMPAD_DELETE = 0x53 if WIN else 'delete' KEY_HOT_NUMPAD_SOLIDUS = 0x35 if WIN else '/' #/ KEY_HOT_NUMPAD_ENTER = 0x11c if WIN else 'enter' KEY_HOT_F1 = 0x3B if WIN else 'f1' KEY_HOT_F2 = 0x3C if WIN else 'f2' KEY_HOT_F3 = 0x3D if WIN else 'f3' KEY_HOT_F4 = 0x3E if WIN else 'f4' KEY_HOT_F5 = 0x3F if WIN else 'f5' KEY_HOT_F6 = 0x40 if WIN else 'f6' KEY_HOT_F7 = 0x41 if WIN else 'f7' KEY_HOT_F8 = 0x42 if WIN else 'f8' KEY_HOT_F9 = 0x43 if WIN else 'f9' KEY_HOT_F10 = 0x44 if WIN else 'f10' KEY_HOT_F11 = 0x57 if WIN else 'f11' KEY_HOT_F12 = 0x58 if WIN else 'f12' KEY_HOT_F13 = 0x7C if WIN else 'f13' KEY_HOT_F14 = 0x7D if WIN else 'f14' KEY_HOT_F15 = 0x7E if WIN else 'f15' KEY_HOT_F16 = 0x7F if WIN else 'f16' KEY_HOT_F17 = 0x80 if WIN else 'f17' KEY_HOT_F18 = 0x81 if WIN else 'f18' KEY_HOT_F19 = 0x82 if WIN else 'f19' KEY_HOT_F20 = 0x83 if WIN else 'f20' KEY_HOT_F21 = 0x84 if WIN else 'f21' KEY_HOT_F22 = 0x85 if WIN else 'f22' KEY_HOT_F23 = 0x86 if WIN else 'f23' KEY_HOT_F24 = 0x87 if WIN else 'f24' KEY_HOT_TILDE = 0x29 if WIN else '~' #~ KEY_HOT_COLON = 0x27 if WIN else ':' #: KEY_HOT_PLUS = 0x0D if WIN else '+' #+ KEY_HOT_MINUS = 0x0C if WIN else '-' #- KEY_HOT_LESS_THAN = 0x33 if WIN else '<' #< , KEY_HOT_GREATER_THAN = 0x34 if WIN else '>' #> . KEY_HOT_SOLIDUS = 0x35 if WIN else '/' #/ ? KEY_HOT_SQUARE_BRACKET_LEFT = 0x1A if WIN else '[' #[ KEY_HOT_SQUARE_BRACKET_RIGHT = 0x1B if WIN else ']' #] KEY_HOT_APOSTROPHE = 0x28 if WIN else "'" #' " KEY_HOT_VERTICAL_LINE = 0x2B if WIN else '|' #| \ KEY_HOT_ESC = 0x1 if WIN else 'esc' KEY_HOT_BACKSPACE = 0x0E if WIN else 'backspace' KEY_HOT_TAB = 0x0F if WIN else 'tab' KEY_HOT_ENTER = 0x1C if WIN else 'enter' KEY_HOT_CONTEXT_MENU = 0x15D if WIN else 'apps' KEY_HOT_SHIFT_LEFT = 0x2A if WIN else 'shiftleft' KEY_HOT_SHIFT_RIGHT = 0x36 if WIN else 'shiftright' KEY_HOT_CTRL_LEFT = 0x1D if WIN else 'ctrlleft' KEY_HOT_CTRL_RIGHT = 0x11D if WIN else 'ctrlright' KEY_HOT_ALT_LEFT = 0x38 if WIN else 'altleft' KEY_HOT_ALT_RIGHT = 0x138 if WIN else 'altright' KEY_HOT_WIN_LEFT = 57435 if WIN else 'winleft' #OLD AND DONT WORK 0x5B KEY_HOT_WIN_RIGHT = 57436 if WIN else 'winright' #OLD AND DONT WORK 0x5C KEY_HOT_CAPS_LOCK = 0x3A if WIN else 'capslock' KEY_HOT_NUM_LOCK = 0x45 if WIN else 'numlock' KEY_HOT_SCROLL_LOCK = 0x46 if WIN else 'scrolllock' KEY_HOT_END = 0x4F if WIN else 'end' KEY_HOT_HOME = 0x47 if WIN else 'home' KEY_HOT_SPACE = 0x39 if WIN else 'space' KEY_HOT_PAGE_UP = 0x49 if WIN else 'pageup' KEY_HOT_PAGE_DOWN = 0x51 if WIN else 'pagedown' KEY_HOT_CLEAR = 0x4C if WIN else 'clear' KEY_HOT_LEFT = 0x4B if WIN else 'left' KEY_HOT_UP = 0x48 if WIN else 'up' KEY_HOT_RIGHT = 0x4D if WIN else 'right' KEY_HOT_DOWN = 0x50 if WIN else 'down' KEY_HOT_PRINT_SCREEN = 0x137 if WIN else 'printscreen' KEY_HOT_INSERT = 0x52 if WIN else 'insert' KEY_HOT_DELETE = 0x53 if WIN else 'delete' KEY_HOT_0 = 0xB if WIN else '0' KEY_HOT_1 = 0x2 if WIN else '1' KEY_HOT_2 = 0x3 if WIN else '2' KEY_HOT_3 = 0x4 if WIN else '3' KEY_HOT_4 = 0x5 if WIN else '4' KEY_HOT_5 = 0x6 if WIN else '5' KEY_HOT_6 = 0x7 if WIN else '6' KEY_HOT_7 = 0x8 if WIN else '7' KEY_HOT_8 = 0x9 if WIN else '8' KEY_HOT_9 = 0xA if WIN else '9' MAP_RUS_ENG = { # FOR LINUX PURPOSE "Ё":"`", "Й":"q", "Ц":"w", "У":"e", "К":"r", "Е":"t", "Н":"y", "Г":"u", "Ш":"i", "Щ":"o", "З":"p", "Х":"[", "Ъ":"]", "Ф":"a", "Ы":"s", "В":"d", "А":"f", "П":"g", "Р":"h", "О":"j", "Л":"k", "Д":"l", "Ж":";", "Э":"'", "Я":"z", "Ч":"x", "С":"c", "М":"v", "И":"b", "Т":"n", "Ь":"m", "Б":",", "Ю":"." } def Write(inTextStr:str, inDelayFloat:float=0, inRestoreStateAfterBool:bool=True, inExactBool:bool=None, inWaitAfterSecFloat:float=WAIT_AFTER_SEC_FLOAT): """L+,W+: Печатает текст, который был передан в переменной inTextStr (поддерживает передачу в одной строке символов разного языка). Не зависит от текущей раскладки клавиатуры! Посылает искусственные клавишные события в ОС, моделируя печать данного текста. Знаки, не доступные на клавиатуре, напечатаны как явный unicode знаки, использующие определенную для ОС функциональность, такие как alt+codepoint. Чтобы гарантировать текстовую целостность, все в настоящее время нажатые ключи выпущены прежде текст напечатан, и модификаторы восстановлены впоследствии. ВНИМАНИЕ! ПЕЧАТАЕТ ЛЮБУЮ СТРОКУ, ДАЖЕ В СОЧЕТАНИИ НЕСКОЛЬКИХ ЯЗЫКОВ ОДНОВРЕМЕННО. ДЛЯ РАБОТЫ С ГОРЯЧИМИ КЛАВИШАМИ ИСПОЛЬЗУЙ ФУНКЦИЮ Send, Up, Down, HotkeyCombination ВНИМАНИЕ! В LINUX НЕ ДЕЙСТВУЮТ СЛЕДУЮЩИЕ ПАРАМЕТРЫ: inRestoreStateAfterBool, inExactBool .. code-block:: python # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.Write("Привет мой милый мир! Hello my dear world!") :param inTextStr: Текст, отправляемый на печать. Не зависит от текущей раскладки клавиатуры! :type inTextStr: str :param inDelayFloat: Число секунд, которое ожидать между нажатиями. По умолчанию 0 :type inDelayFloat: float, опциональный :param inRestoreStateAfterBool: Может использоваться, чтобы восстановить регистр нажатых ключей после того, как текст напечатан, т.е. нажимает ключи, которые были выпущены в начало. :type inRestoreStateAfterBool: bool, опциональный :param inExactBool: Печатает все знаки как явный unicode. Необязательный параметр :type inExactBool: bool, опциональный :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ if CrossOS.IS_WINDOWS_BOOL: write(text=inTextStr, delay=inDelayFloat, restore_state_after=inRestoreStateAfterBool, exact=inExactBool) elif CrossOS.IS_LINUX_BOOL: _WriteLinux(inTextStr=inTextStr, inDelayFloat=inDelayFloat) time.sleep(inWaitAfterSecFloat) def _WriteLinux(inTextStr, inDelayFloat=0.01): lModuleKeyboard = sys.modules[__name__] lVarList = dir(lModuleKeyboard) lLayoutStr = None for lCharStr in inTextStr: # Check rus (ru) lVarNameStr = f"KEY_RUS_{lCharStr.upper()}" lFoundBool = False lShiftBool = False if lVarNameStr in lVarList: lNewLayoutStr=getattr(lModuleKeyboard, "KEY_RUS_LAYOUT") lCapBool = lCharStr.isupper() lCharStr = MAP_RUS_ENG[lCharStr.upper()] #if lCapBool == True: lCharStr=lCharStr.upper() if lCapBool == True: lShiftBool=True lFoundBool=True # Check eng (us) lVarNameStr = f"KEY_ENG_{lCharStr.upper()}" if lVarNameStr in lVarList and lFoundBool == False: lNewLayoutStr=getattr(lModuleKeyboard, "KEY_ENG_LAYOUT") lFoundBool=True if lFoundBool == False: lNewLayoutStr=getattr(lModuleKeyboard, "KEY_ENG_LAYOUT") # CHECK LAST LAYOUT if lNewLayoutStr != lLayoutStr: #print(f"setxkbmap -layout {lNewLayoutStr}") os.system(f"setxkbmap -layout {lNewLayoutStr}") lLayoutStr = lNewLayoutStr if lShiftBool == True: pyautogui.keyDown('shift') # hold down the shift key pyautogui.write(lCharStr, interval = inDelayFloat) if lShiftBool == True: pyautogui.keyUp('shift') # hold down the shift key # Set 2 layout with alt+shift switch os.system(f"setxkbmap -layout {getattr(lModuleKeyboard, 'KEY_ENG_LAYOUT')},{getattr(lModuleKeyboard, 'KEY_RUS_LAYOUT')} -option grp:alt_shift_toggle") def HotkeyCombination(*inKeyList, inDelaySecFloat = 0.3,inWaitAfterSecFloat:float=WAIT_AFTER_SEC_FLOAT): """L+,W+: Получает перечень клавиш для одновременного нажатия. Между нажатиями программа ожидания время inDelaySecFloat ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ .. code-block:: python # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.HotkeyCombination(Keyboard.KEY_HOT_CTRL_LEFT,Keyboard.KEY_ENG_A) # Ctrl + a Keyboard.HotkeyCombination(Keyboard.KEY_HOT_CTRL_LEFT,Keyboard.KEY_ENG_C) # Ctrl + c Keyboard.HotkeyCombination(Keyboard.KEY_HOT_CTRL_LEFT,Keyboard.KEY_ENG_A) Keyboard.HotkeyCombination(Keyboard.KEY_HOT_ALT_LEFT,Keyboard.KEY_HOT_TAB, Keyboard.KEY_HOT_TAB) :param inKeyList: Список клавиш для одновременного нажатия. Перечень клавиш см. в разделе "Коды клавиш". Пример: KEY_HOT_CTRL_LEFT,KEY_ENG_A :param inDelaySecFloat: Интервал между нажатиями. Необходим в связи с тем, что операционной системе требуется время на реакцию на нажатие клавиш, по умолчанию: 0.3 :type inDelaySecFloat: float, опциональный :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ for l_key_item in inKeyList: if l_key_item == inKeyList[-1]: send(l_key_item) else: press(l_key_item) time.sleep(inDelaySecFloat) lRevKeyList = list(reversed(inKeyList)) for l_key_item in lRevKeyList: if l_key_item == lRevKeyList[0]: pass else: release(l_key_item) time.sleep(inDelaySecFloat) time.sleep(inWaitAfterSecFloat) def HotkeyCtrlV(inWaitAfterSecFloat:float=0.4) -> None: """L+,W+: Выполнить вставку текста из буфера обмена ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ .. code-block:: python # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.HotkeyCtrlV() :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ HotkeyCombination(KEY_HOT_CTRL_LEFT,KEY_ENG_V) # Ctrl + v time.sleep(inWaitAfterSecFloat) def HotkeyCtrlA_CtrlC(inWaitAfterSecFloat:float=0.4) -> None: """L+,W+: Выполнить выделение текста, после чего скопировать его в буфер обмена ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ .. code-block:: python # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.HotkeyCtrlA_CtrlC() # Отправить команды: выделить все, скопировать в буфер обмена :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ HotkeyCombination(KEY_HOT_CTRL_LEFT,KEY_ENG_A) # Ctrl + a HotkeyCombination(KEY_HOT_CTRL_LEFT,KEY_ENG_C) # Ctrl + c time.sleep(inWaitAfterSecFloat) def Send(inKeyInt:int, inDoPressBool:bool=True, inDoReleaseBool:bool=True,inWaitAfterSecFloat:float=WAIT_AFTER_SEC_FLOAT) -> None: """L+,W+: Имитация нажатия/отпускания любой физической клавиши. Посылает событие в операционную систему, которые выполняет нажатие и отпускание данной клавиши ВНИМАНИЕ! ПРИ ПОПЫТКЕ ПЕЧАТИ ТЕКСТА БУДЕТ УЧИТЫВАТЬ ТЕКУЩУЮ РАСКЛАДКУ КЛАВИАТУРЫ. ДЛЯ ПЕЧАТИ ТЕКСТА ИСПОЛЬЗУЙ Write! .. code-block:: python # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.Send(Keyboard.KEY_ENG_A) # Нажать клавишу A. Если будет активна русская раскладка, то будет выведена буква ф. :param inKeyInt: Перечень клавиш см. в разделе "Коды клавиш". Пример: KEY_HOT_CTRL_LEFT,KEY_ENG_A :type inKeyInt: int :param inDoPressBool: Выполнить событие нажатия клавиши, По умолчанию True :type inDoPressBool: bool, опциональный :param inDoReleaseBool: Выполнить событие отпускания клавиши, По умолчанию True :type inDoReleaseBool: bool, опциональный :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ send(hotkey=inKeyInt, do_press=inDoPressBool, do_release=inDoReleaseBool) time.sleep(inWaitAfterSecFloat) def Up(inKeyInt:int, inWaitAfterSecFloat:float=WAIT_AFTER_SEC_FLOAT) -> None: """L+,W+: Отпустить (поднять) клавишу. Если клавиша уже была поднята, то ничего не произойдет. ВНИМАНИЕ! ПРИ ПОПЫТКЕ ПЕЧАТИ ТЕКСТА БУДЕТ УЧИТЫВАТЬ ТЕКУЩУЮ РАСКЛАДКУ КЛАВИАТУРЫ. ДЛЯ ПЕЧАТИ ТЕКСТА ИСПОЛЬЗУЙ Write! ВНИМАНИЕ! ФУНКЦИЯ МОЖЕТ ОТРАБОТАТЬ НЕКОРРЕКТНО В ТОМ СЛУЧАЕ, ЕСЛИ ДЕЙСТВИЕ ПРОИСХОДИТ СРАЗУ ПОСЛЕ НАЖАТИЯ КЛАВИШИ ENTER (ИСПОЛЬЗУЙТЕ SLEEP) .. code-block:: python # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.Up(Keyboard.KEY_ENG_A) # Отпустить клавишу A. :param inKeyInt: Перечень клавиш см. в разделе "Коды клавиш". Пример: KEY_HOT_CTRL_LEFT, KEY_ENG_A :type inKeyInt: int :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ send(hotkey=inKeyInt, do_press=False, do_release=True) time.sleep(inWaitAfterSecFloat) def Down(inKeyInt:int, inWaitAfterSecFloat:float=WAIT_AFTER_SEC_FLOAT) -> None: """L+,W+: Нажать (опустить) клавишу. Если клавиша уже была опущена, то ничего не произойдет. ВНИМАНИЕ! ПРИ ПОПЫТКЕ ПЕЧАТИ ТЕКСТА БУДЕТ УЧИТЫВАТЬ ТЕКУЩУЮ РАСКЛАДКУ КЛАВИАТУРЫ. ДЛЯ ПЕЧАТИ ТЕКСТА ИСПОЛЬЗУЙ Write! ВНИМАНИЕ! ФУНКЦИЯ МОЖЕТ ОТРАБОТАТЬ НЕКОРРЕКТНО В ТОМ СЛУЧАЕ, ЕСЛИ ДЕЙСТВИЕ ПРОИСХОДИТ СРАЗУ ПОСЛЕ НАЖАТИЯ КЛАВИШИ ENTER (ИСПОЛЬЗУЙТЕ SLEEP) .. code-block:: python # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.Down(Keyboard.KEY_ENG_A) # Отпустить клавишу A. :param inKeyInt: Перечень клавиш см. в разделе "Коды клавиш". Пример: KEY_HOT_CTRL_LEFT, KEY_ENG_A :type inKeyInt: int :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ send(hotkey=inKeyInt, do_press=True, do_release=False) time.sleep(inWaitAfterSecFloat) def IsDown(inKeyInt:int) -> bool: """L+,W+: Проверить, опущена ли клавиша. Вернет True если опущена; False если поднята. ВНИМАНИЕ! ПРИ ПОПЫТКЕ ПЕЧАТИ ТЕКСТА БУДЕТ УЧИТЫВАТЬ ТЕКУЩУЮ РАСКЛАДКУ КЛАВИАТУРЫ. ДЛЯ ПЕЧАТИ ТЕКСТА ИСПОЛЬЗУЙ Write! .. code-block:: python # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard lKeyAIsPressedBool = Keyboard.IsDown(Keyboard.KEY_ENG_A) # Проверить, опущена ли клавиша A. :param inKeyInt: Перечень клавиш см. в разделе "Коды клавиш". Пример: KEY_HOT_CTRL_LEFT, KEY_ENG_A :type inKeyInt: int """ return is_pressed(inKeyInt) def Wait(inKeyInt:int,inWaitAfterSecFloat:float=WAIT_AFTER_SEC_FLOAT): """L-,W+: Блокирует осуществление программы, пока данная обозначенная клавиша не будет нажата. ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ. ОЖИДАЕТ НАЖАТИЕ СООТВЕТСВУЮЩЕЙ ФИЗИЧЕСКОЙ КЛАВИШИ .. code-block:: python # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.Wait(Keyboard.KEY_ENG_A) # Ждать нажатие клавиши A. :param inKeyInt: Перечень клавиш см. в разделе "Коды клавиш". Пример: KEY_HOT_CTRL_LEFT,KEY_ENG_A :type inKeyInt: int :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) :type inWaitAfterSecFloat: float, опциональный """ wait(hotkey=inKeyInt) time.sleep(inWaitAfterSecFloat) if CrossOS.IS_WINDOWS_BOOL: key_to_scan_codes("win") # 2022 06 10 Люблю смотреть скан код клавиши Виндовс :)