diff --git a/Sources/GuideSphinx/03_Copyrights_Contacts.rst b/Sources/GuideSphinx/03_Copyrights_Contacts.rst index 34fee7ec..c4da260c 100644 --- a/Sources/GuideSphinx/03_Copyrights_Contacts.rst +++ b/Sources/GuideSphinx/03_Copyrights_Contacts.rst @@ -57,9 +57,8 @@ pyOpenRPA - роботы Вам помогут! Используемые сторонние компоненты (лицензионная чистота) ********************************************************** -- WinPython, v3.7.1 32-bit & 64-bit, лицензия MIT - https://github.com/winpython/winpython -- Selenium, v3.141.0, лицензия Apache 2.0 https://github.com/SeleniumHQ/selenium/blob/trunk/LICENSE) +- WinPython, v3.7.1 32-bit & 64-bit, лицензия MIT (https://github.com/winpython/winpython) +- Selenium, v3.141.0, лицензия Apache 2.0 (https://github.com/SeleniumHQ/selenium/blob/trunk/LICENSE) - pywinauto, v0.6.5, лицензия BSD 3-Clause (https://github.com/pywinauto/pywinauto) - Semantic UI, v2.4.1, лицензия MIT (https://github.com/Semantic-Org/Semantic-UI) - PyAutoGUI, v0.9.44, лицензия BSD 3-Clause (https://github.com/asweigart/pyautogui) @@ -71,4 +70,5 @@ pyOpenRPA - роботы Вам помогут! - requests, v2.22.0, лицензия Apache 2.0 (https://github.com/psf/requests/blob/main/LICENSE) - JsRender, v1.0.2, лицензия MIT (https://github.com/BorisMoore/jsrender/blob/master/MIT-LICENSE.txt) - Handlebars, v4.1.2, лицензия MIT, (https://github.com/handlebars-lang/handlebars.js/blob/master/LICENSE) -- jinja2, v2.11.2, лицензия BSD 3-Clause, (https://github.com/pallets/jinja/blob/main/LICENSE.rst) \ No newline at end of file +- jinja2, v2.11.2, лицензия BSD 3-Clause, (https://github.com/pallets/jinja/blob/main/LICENSE.rst) +- JupiterNotebook v6.1.4, лицензия BSD 3-Clause, https://github.com/jupyter/notebook/blob/main/LICENSE \ No newline at end of file diff --git a/Sources/GuideSphinx/Robot/02_uidesktop.rst b/Sources/GuideSphinx/Robot/02_uidesktop.rst index 99d23293..2ad32908 100644 --- a/Sources/GuideSphinx/Robot/02_uidesktop.rst +++ b/Sources/GuideSphinx/Robot/02_uidesktop.rst @@ -22,10 +22,6 @@ How to use both x32 and x64 python processes (it can be helpfully, if another ap UIDesktop.Utils.ProcessBitness.SettingsInit(lPyOpenRPA_SettingsDict) # Now you can use pyOpenRPA with both bitness. -.. automodule:: pyOpenRPA.Robot.Keyboard - :members: - :autosummary: - .. automodule:: pyOpenRPA.Robot.UIDesktop :members: diff --git a/Sources/GuideSphinx/Robot/04_keyboard.rst b/Sources/GuideSphinx/Robot/04_keyboard.rst index ebb8fcaf..3b9ef7b4 100644 --- a/Sources/GuideSphinx/Robot/04_keyboard.rst +++ b/Sources/GuideSphinx/Robot/04_keyboard.rst @@ -4,36 +4,29 @@ 4. Keyboard #################################### +Клавиатура - это главный текстовый инструмент, который обладает 100% точностью передачи данных. С его помощью можно отправлять сообщения, ожидать нажатия и выполнять различные комбинации клавиш. На этой странице представлена вся необходимая информация по управлению клавиатурой со стороны программного робота RPA. + +В отличие от многих RPA платформ, pyOpenRPA обладает функциями, которые не зависят от текущей раскладки клавиатуры. За счет этого надежность и стабильность программного робота существенно возрастает. + +ВНИМАНИЕ! ПРИ ВЫЗОВЕ ФУНКЦИЙ ОБРАЩАЙТЕ ВНИМАНИЕ НА РЕГИСТР. + ************************************************** Примеры использования ************************************************** -Here you can find the functions description for interaction with desktop GUI applications - -How to use both x32 and x64 python processes (it can be helpfully, if another app GUI is on another bitness than your app) - .. code-block:: python # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard - from pyOpenRPA.Robot import Clipboard - Keyboard.send("win+r") - time.sleep(0.3) - Keyboard.write("cmd") - time.sleep(0.3) - Keyboard.send("enter") - time.sleep(0.6) - Keyboard.write("echo %time%") - time.sleep(0.3) - Keyboard.send("enter") - time.sleep(0.3) - Keyboard.send("ctrl+a") - time.sleep(0.6) - Clipboard.ClipboardSet("") - Keyboard.send("ctrl+c") - time.sleep(0.6) - lTextRaw = Clipboard.ClipboardGet() - lTimeStr = lTextRaw.split("\n")[-3] + Keyboard.HotkeyCombination(Keyboard.KEY_HOT_WIN_LEFT,Keyboard.KEY_ENG_R) + Keyboard.Write("cmd") + Keyboard.Send(Keyboard.KEY_HOT_ENTER, inWaitAfterSecFloat=0.6) + Keyboard.Write("echo %time%") + Keyboard.Send(Keyboard.KEY_HOT_ENTER) + Keyboard.HotkeyCombination(Keyboard.KEY_HOT_CTRL_LEFT, Keyboard.KEY_ENG_A, inWaitAfterSecFloat=0.6) + Keyboard.HotkeyCombination(Keyboard.KEY_HOT_CTRL_LEFT, Keyboard.KEY_ENG_C, inWaitAfterSecFloat=0.6) + +Коды клавиш см. ниже ************************************************** Описание методов diff --git a/Sources/pyOpenRPA/Robot/Keyboard.py b/Sources/pyOpenRPA/Robot/Keyboard.py index 137e2056..dc50d73b 100644 --- a/Sources/pyOpenRPA/Robot/Keyboard.py +++ b/Sources/pyOpenRPA/Robot/Keyboard.py @@ -1,5 +1,6 @@ from keyboard import * import time + # ШЕСТНАДЦАТИРИЧНЫЙ СКАН-КОД В РУССКОЙ РАСКЛАДКЕ (НЕЗАВИСИМО ОТ ВЫБРАННОГО ЯЗЫКА НА КЛАВИАТУРЕ) # ОТОБРАЖЕНИЕ СКАН КОДОВ НА КЛАВИАТУРЕ https://snipp.ru/handbk/scan-codes @@ -130,8 +131,8 @@ KEY_HOT_CTRL_LEFT = 0x1D KEY_HOT_CTRL_RIGHT = 0x11D KEY_HOT_ALT_LEFT = 0x38 KEY_HOT_ALT_RIGHT = 0x138 -KEY_HOT_WIN_LEFT = 0x5B -KEY_HOT_WIN_RIGHT = 0x5C +KEY_HOT_WIN_LEFT = 57435 #OLD AND DONT WORK 0x5B +KEY_HOT_WIN_RIGHT = 57436 #OLD AND DONT WORK 0x5C KEY_HOT_CAPS_LOCK = 0x3A KEY_HOT_NUM_LOCK = 0x45 KEY_HOT_SCROLL_LOCK = 0x46 @@ -160,45 +161,121 @@ KEY_HOT_7 = 0x8 KEY_HOT_8 = 0x9 KEY_HOT_9 = 0xA -def Write(inTextStr:str, inDelayFloat:float=0, inRestoreStateAfterBool:bool=True, inExactBool:bool=None): +def Write(inTextStr:str, inDelayFloat:float=0, inRestoreStateAfterBool:bool=True, inExactBool:bool=None, inWaitAfterSecFloat:float=0.4): """ - Печать текста. Не зависит от текущей раскладки клавиатуры! Посылает искусственные клавишные события в ОС, моделируя печать данного текста. Знаки, не доступные на клавиатуре, напечатаны как явный unicode знаки, использующие определенную для ОС функциональность, такие как alt+codepoint. + Печатает текст, который был передан в переменной inTextStr (поддерживает передачу в одной строке символов разного языка). Не зависит от текущей раскладки клавиатуры! Посылает искусственные клавишные события в ОС, моделируя печать данного текста. Знаки, не доступные на клавиатуре, напечатаны как явный unicode знаки, использующие определенную для ОС функциональность, такие как alt+codepoint. Чтобы гарантировать текстовую целостность, все в настоящее время нажатые ключи выпущены прежде текст напечатан, и модификаторы восстановлены впоследствии. + ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ + + .. code-block:: python + + # Keyboard: Взаимодействие с клавиатурой + from pyOpenRPA.Robot import Keyboard + Keyboard.Write("Привет мой милый мир! Hello my dear world!") + :param inTextStr: Текст, отправляемый на печать. Не зависит от текущей раскладки клавиатуры! :type inTextStr: str - :param inDelayFloat: Число секунд, которое ожидать между нажатиями. defaults to 0 + :param inDelayFloat: Число секунд, которое ожидать между нажатиями. По умолчанию 0 :type inDelayFloat: float, опционально :param inRestoreStateAfterBool: Может использоваться, чтобы восстановить регистр нажатых ключей после того, как текст напечатан, т.е. нажимает ключи, которые были выпущены в начало. :type inRestoreStateAfterBool: bool, опционально :param inExactBool: Печатает все знаки как явный unicode. Необязательный параметр :type inExactBool: bool, опционально + :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию 0.4 + :type inWaitAfterSecFloat: float, опционально """ write(text=inTextStr, delay=inDelayFloat, restore_state_after=inRestoreStateAfterBool, exact=inExactBool) + time.sleep(inWaitAfterSecFloat) -def HotkeyCombination(*inKeyList, inDelaySecFloat = 0.3): +def HotkeyCombination(*inKeyList, inDelaySecFloat = 0.3,inWaitAfterSecFloat:float=0.4): """Получает перечень кнопок для одновременного нажатия. Между нажатиями программа ожидания время inDelaySecFloat - + ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ + .. code-block:: python # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard - Keyboard.HotkeyCombination("ctrl",Keyboard.KEY_ENG_A) # Ctrl + a - Keyboard.HotkeyCombination("ctrl",Keyboard.KEY_ENG_C) # Ctrl + c - - :param inKeyList: Список клавиш для одновременного нажатия + 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: Количество секунд, которые ожидать после выполнения операции. По умолчанию 0.4 + :type inWaitAfterSecFloat: float, опционально """ for l_key_item in inKeyList: - press(l_key_item) + if l_key_item == inKeyList[-1]: + send(l_key_item) + else: + press(l_key_item) time.sleep(inDelaySecFloat) - for l_key_item in inKeyList: - release(l_key_item) + 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 HotkeyCtrlA_CtrlC() -> None: +def HotkeyCtrlA_CtrlC(inWaitAfterSecFloat:float=0.4) -> None: """Выполнить выделение текста, после чего скопировать его в буфер обмена + ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ + + .. code-block:: python + + # Keyboard: Взаимодействие с клавиатурой + from pyOpenRPA.Robot import Keyboard + Keyboard.HotkeyCtrlA_CtrlC() # Отправить команды: выделить все, скопировать в буфер обмена + :param inWaitAfterSecFloat: Количество секунд, которые ожидать после выполнения операции. По умолчанию 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=0.4) -> None: + """ + Посылает событие в операционную систему, которые выполняет нажатие и отпускание данной клавиши + ВНИМАНИЕ! ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ + + .. 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: Количество секунд, которые ожидать после выполнения операции. По умолчанию 0.4 + :type inWaitAfterSecFloat: float, опционально + """ + send(hotkey=inKeyInt, do_press=inDoPressBool, do_release=inDoReleaseBool) + time.sleep(inWaitAfterSecFloat) + +def Wait(inKeyInt:int,inWaitAfterSecFloat:float=0.4): + """Блокирует осуществление программы, пока данная обозначенная кнопка не будет нажата. + ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ. ОЖИДАЕТ НАЖАТИЕ СООТВЕТСВУЮЩЕЙ ФИЗИЧЕСКОЙ КЛАВИШИ + + .. 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: Количество секунд, которые ожидать после выполнения операции. По умолчанию 0.4 + :type inWaitAfterSecFloat: float, опционально """ - HotkeyCombination("ctrl",KEY_ENG_A) # Ctrl + a - HotkeyCombination("ctrl",KEY_ENG_C) # Ctrl + c \ No newline at end of file + wait(hotkey=inKeyInt) + time.sleep(inWaitAfterSecFloat)