Симуляция нажатия клавиш клавиатуры на python
В данной статье рассмотрено три задачи, которые требуются чтобы управлять компьютером на windows с помощью скрипта python. В первую очередь будет показано как выбрать необходимое окно по названию, потом как симулировать ввод текста, нажатие на клавиши, и других операций (например выделение текста ctrl+a). А также будет показано как передвинуть курсор мыши в определенную точку xy и сделать клик.
Программа ниже написана на python 3.4 и по моему замыслу должна ускорить выполнение типичной операции в одной из наших программ на работе. В комментариях подробно описано симулирование клавиш и клика
# импортируем модули для работы с windows оберткой import win32api, win32con, win32gui import time, win32com.client #функция клика в определенном месте def click(x,y): # сначала выставляем позицию win32api.SetCursorPos((x,y)) time.sleep(0.2) # а потом кликаем (небольшая задержка для большей человечности) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0) time.sleep(0.3) win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0) # данная функция - фильтр по выбору нужного окна (по названию этого окна) def openItNow(hwnd, windowText): if windowText in win32gui.GetWindowText(hwnd): win32gui.SetForegroundWindow(hwnd) # приступим time.sleep(3) # выбираем среди открытых окон то, которое содержит название Notepad # заметьте что используется фильтр, описанный выше win32gui.EnumWindows(openItNow, 'Notepad') # нажимать на клавиши будет с помощью shell shell = win32com.client.Dispatch("WScript.Shell") # метод SendKeys программно нажимает на клавиши, поэтому далее записана последовательность нажатий shell.SendKeys("%") for i in range(0,4,1): shell.SendKeys("") time.sleep(0.1) shell.SendKeys("") shell.SendKeys("") shell.SendKeys("") time.sleep(0.1) shell.SendKeys("~") time.sleep(7) for i in range(0,20,1): shell.SendKeys("") for i in range(0,11,1): shell.SendKeys("") #здесь выполняем комбинацию клавиш Alt + 9 shell.SendKeys("%9") # а теперь пара кликов click(300, 700) click(300, 600) shell.SendKeys('вводим текст') time.sleep(3) # и опять комбинация shell.SendKeys("^+")
Чтобы знать как симулировать нажатие разных клавиш (keypress), нам понадобится таблица с расшифровкой текст — клавиша.
| Клавиша | Аргумент |
| BACKSPACE | , , or |
| BREAK | |
| CAPS LOCK | |
| DEL or DELETE | or |
| DOWN ARROW | |
| END | |
| ENTER | or ~ |
| ESC | |
| HELP | |
| HOME | |
| INS or INSERT | or |
| LEFT ARROW | |
| NUM LOCK | |
| PAGE DOWN | |
| PAGE UP | |
| PRINT SCREEN | |
| RIGHT ARROW | |
| SCROLL LOCK | |
| TAB | |
| UP ARROW | |
| F1 | |
| F2 | |
| F3 | |
| F4 | |
| F5 | |
| F6 | |
| F7 | |
| F8 | |
| F9 | |
| F10 | |
| F11 | |
| F12 | |
| F13 | |
| F14 | |
| F15 | |
| F16 | |
| SHIFT | + |
| CTRL | ^ |
| ALT | % |
| ENTER | ~ |
Написав несколько таких скриптов (выполняющих определенную последовательность нажатий на клавиатуре) вы сможете существенно ускорить выполнение своих ежедневных операций!
Как сэмулировать нажатия клавиш мышки и клавиатуры по координатам
Собственно вопрос, как например подключится к exe приложению(зная pid процесса), например к игре и далее с эмулировать нажатия клавиш мышки и клавиатуры, как сделать с помощью например win32api, win32con понимаю, но хочу чтобы мышка компьютера была свободная в это время
Как это правильно называется чтобы загулить? по запросу «python inject in exe/game» ничего не могу найти или может библиотеки посоветуете Спасибо за любые наводки! mousehook же относится к этому?
на другом сайте советовали такое решение, но видимо ему лет 10 уже, не работает
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
import win32api import win32con pid = 12345 # replace with the PID of the target process # Set up a mouse event hook def mouse_event(event): input_type = win32con.INPUT_MOUSE flags = win32con.MOUSEEVENTF_ABSOLUTE | win32con.MOUSEEVENTF_LEFTDOWN | win32con.MOUSEEVENTF_LEFTUP x = int(event.x * (65535/win32api.GetSystemMetrics(win32con.SM_CXSCREEN))) # normalize screen coordinates y = int(event.y * (65535/win32api.GetSystemMetrics(win32con.SM_CYSCREEN))) data = win32api.MAKELONG(x, y) extra_info = 0 # Inject the mouse event input_event = win32con.INPUT(type=input_type, mi=win32con.MOUSEINPUT(dx=x, dy=y, mouse_data=0, dw_flags=flags, time=0, dw_extra_info=extra_info)) win32api.SendInput(1, (input_event,)) # Set up the hook mouse_hook = win32api.SetWindowsHookEx(win32con.WH_MOUSE_LL, mouse_event, win32api.GetModuleHandle(None), 0) # Wait for the user to close the program win32api.PumpMessages()
Эмуляция нажатий клавиш клавиатуры на Python 3 под Windows
Каким образом можно симулировать нажатия клавиш клавиатуры, чтобы, например, запустив соответствующий скрипт, заданный текст сам набирался в сторонней программе? Однако больше интересует эмуляция сочетания клавиш, причем не символьных или цифирных, а таких как CTRL или SHIFT. Кроссплатформенность не важна.
Отслеживать
задан 16 янв 2017 в 13:11
Constantor Constantor
567 2 2 золотых знака 6 6 серебряных знаков 18 18 бронзовых знаков
Существовал SendKeys модуль, который легко позволял специальные клавиши использовать. Не знаю, работает ли на Python 3. Вот пример использования (в конце ответа.
16 янв 2017 в 14:00
Проблема в том, что через pip3 install sendkeys он не устанавливается, падает с ошибками, никак не исключёнными!
16 янв 2017 в 14:02
вполне вероятно. Модуль древний и главное его (варианта) достоинство было это простота и отсутствие зависимостей кроме ctypes (не могу сейчас исходник найти, вот пример как он мог выглядеть). pywinauto менее простой модуль, который также SendInput() API использует. Единственный недостаток pyautogui по сравнению с SendKeys, то что pillow является зависимостью, а так одни плюсы: также простой, но переносимый, поддерживает не только клавиши.
PyAutoGUI — работа с клавиатурой
Привет всем! В продолжение записи, посвященной азам работы с библиотекой автоматизации действий PyAutoGUI (в этой записи я сделал описание этой прекрасной библиотеки, рассматривал общие примеры + приводил примеры работы с мышкой) — пришла пора (угу, почти спустя год) написать о методике работы с клавиатурой. Поехали!
Основная функция работы клавиатуры — ввод символов в нужной строке. Делается это следующим образом:
pyautogui.write('Hello, World!')
Если же вам нужно ввести текст с неким интервалом — добавим интервал в команду:
pyautogui.write('Hello, World!', interval = 0.50)
С вводом текста разобрались. А как быть, если нужно нажать какие-либо клавиши? Для этого используем метод press():
pyautogui.press('enter') #Нажимаем клавишу "Ввод" pyautogui.press('f1') #Нажимаем клавишу F1 pyautogui.press('left') #Нажимаем клавишу "Влево"
Интересно, что функция press() — лишь обертка для функций KeyDown() и KeyUp(), которые имитируют нажатие на клавишу, а потом отпуск этой клавиши. НО! В случае необходимости можно имитировать эти действия самостоятельно:
pyautogui.keyDown('shift') #Нажимаем клавишу "Shift" pyautogui.press('left') #Нажимаем клавишу "Влево" pyautogui.press('left') #Нажимаем клавишу "Влево" pyautogui.press('left') #Нажимаем клавишу "Влево" pyautogui.keyUp('shift') #Отпускаем клавишу "Shift"
Ок, с этим разобрались, едем далее. Теперь разберемся, как оптимизировать все написанное выше (согласитесь, описывать каждое нажатие клавиш — крайне неудобно). Делаем следующее:
pyautogui.press(['left', 'left', 'left']) #Нажали клавишу "Влево" три раза подряд
а можно сделать так:
pyautogui.press('left', presses=3) #Нажали клавишу "Влево" три раза подряд ;) Согласитесь - этот вариант как-то попроще.
Кстати, ничего не мешает удерживать одну клавишу, и нажимать другую. Реализуется это двумя методами. Первый:
with pyautogui.hold('shift'): pyautogui.press(['left', 'left', 'left']) #На нормальном языке это значит следующее: когда клавиша Shift зажата - три раза нажимаем клавишу "Влево"
Две строки — но на деле они заменяют код, написанный ниже:
pyautogui.keyDown('shift') #Нажать клавишу "Shift" pyautogui.press('left') #Нажать клавишу "Влево" pyautogui.press('left') #Нажать клавишу "Влево" pyautogui.press('left') #Нажать клавишу "Влево" pyautogui.keyUp('shift') #Отпустить клавишу "Shift"
И в конце сегодняшей записи, посвященно работе с клавиатурой с помощью библиотеки Pyautogui расскажу, как реализовать нажатие нескольких клавиш по указанной схеме. Для этого используется метод hotkey(). Пример — ниже:
pyautogui.hotkey('ctrl', 'shift', 'esc')
Одна строка! Элементарно, Ватсон! А если бы мы описывали это с помощью простых нажатий клавиш — нам пришлось бы писать код:
pyautogui.keyDown('ctrl') pyautogui.keyDown('shift') pyautogui.keyDown('esc') pyautogui.keyUp('esc') pyautogui.keyUp('shift') pyautogui.keyUp('ctrl')
Кстати, интервал в нажатии клавиш никто не отменяет Напоминаю: interval=0.25 — интервал между нажатиями клавиш в милисекундах.
На всякий случай — ниже укажу полный список всего, что можно использовать методаз, описанных сегодня (press(), keyDown(), keyUp(), hothey()):
‘\t’, ‘\n’, ‘\r’, ‘ ‘, ‘!’, ‘»‘, ‘#’, ‘$’, ‘%’, ‘&’, «‘», ‘(‘,
‘)’, ‘*’, ‘+’, ‘,’, ‘-‘, ‘.’, ‘/’, ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’,
‘8’, ‘9’, ‘:’, ‘;’, ‘’, ‘?’, ‘@’, ‘[‘, ‘\’, ‘]’, ‘^’, ‘_’, ‘`’,
‘a’, ‘b’, ‘c’, ‘d’, ‘e’,’f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’,
‘p’, ‘q’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’, ‘’, ‘~’,
‘accept’, ‘add’, ‘alt’, ‘altleft’, ‘altright’, ‘apps’, ‘backspace’,
‘browserback’, ‘browserfavorites’, ‘browserforward’, ‘browserhome’,
‘browserrefresh’, ‘browsersearch’, ‘browserstop’, ‘capslock’, ‘clear’,
‘convert’, ‘ctrl’, ‘ctrlleft’, ‘ctrlright’, ‘decimal’, ‘del’, ‘delete’,
‘divide’, ‘down’, ‘end’, ‘enter’, ‘esc’, ‘escape’, ‘execute’, ‘f1’, ‘f10’,
‘f11’, ‘f12’, ‘f13’, ‘f14’, ‘f15’, ‘f16’, ‘f17’, ‘f18’, ‘f19’, ‘f2’, ‘f20’,
‘f21’, ‘f22’, ‘f23’, ‘f24’, ‘f3’, ‘f4’, ‘f5’, ‘f6’, ‘f7’, ‘f8’, ‘f9’,
‘final’, ‘fn’, ‘hanguel’, ‘hangul’, ‘hanja’, ‘help’, ‘home’, ‘insert’, ‘junja’,
‘kana’, ‘kanji’, ‘launchapp1’, ‘launchapp2’, ‘launchmail’,
‘launchmediaselect’, ‘left’, ‘modechange’, ‘multiply’, ‘nexttrack’,
‘nonconvert’, ‘num0’, ‘num1’, ‘num2’, ‘num3’, ‘num4’, ‘num5’, ‘num6’,
‘num7’, ‘num8’, ‘num9’, ‘numlock’, ‘pagedown’, ‘pageup’, ‘pause’, ‘pgdn’,
‘pgup’, ‘playpause’, ‘prevtrack’, ‘print’, ‘printscreen’, ‘prntscrn’,
‘prtsc’, ‘prtscr’, ‘return’, ‘right’, ‘scrolllock’, ‘select’, ‘separator’,
‘shift’, ‘shiftleft’, ‘shiftright’, ‘sleep’, ‘space’, ‘stop’, ‘subtract’, ‘tab’,
‘up’, ‘volumedown’, ‘volumemute’, ‘volumeup’, ‘win’, ‘winleft’, ‘winright’, ‘yen’,
‘command’, ‘option’, ‘optionleft’, ‘optionright’
На этом все что я хотел рассказать сегодня о работе с клавиатурой с помощью библиотеки Pyautogui в Python — заканчивается. Продолжение — скоро (раньше, чем через год, обещаю). И как всегда — в случае возникновения вопросов пишите на почту, или в Телеграм
