Форум сайта python.su
Добрый день форумчане!
При выполнении определенной задачи по автоматизации столкнулся с ниже указанной проблемой.
Мой скрипт открывает RDP (Удаленный рабочий стол) на винде, делает окно активным и нажимает клавишу Return (Enter). Загвоздка заключается в том что все эмуляторы клавиатуры которые я перепробовал (а именно Sendkeys, win32api, ctypes, pyuserinput, pykeyboard и т.п), отправляют команду нажатия клавиши не якобы физически, а системно. Соответственно RDP не распознает нажатую клавишу, т.к. удаленный рабочий стол может считывать либо команды из своей системы, либо с подключенной клавиатуры физически.
Каким макаром мне обмануть хитросплетение этих двух систем и заставить скрипт нажимать эмулировать нажатие клавиш физически?
З.Ы. Заранее благодарен за ответы, буду рад если существуют библиотеки занимающиеся подобной ересью.
Офлайн
Никаким. Уже много раз подымалась данная тема на форуме.
Ибо пытаясь семулировать нажатие клавиши при раоте с той же либой win32 вы взаимодействуете с ПК с которого запускается РДП а не компом который в средине сессии!
Другими словами, если хотите направление для размышления вам нужно подключится к апи удаленного ПК внутри RDP сессии и уже потом емулировать что вам нужно.
Теоретически можно попробовать примянять нажатие ентера на активном окне коим долэен оказаться ваш РДП сеанс - но тут магия
Офлайн
ZerGСпасибо! Появилась мысль каким нибудь способом перехватить пакеты с клавиатуры, но тут уже начинаются танцы с бубном, не иначе.
Никаким. Уже много раз подымалась данная тема на форуме. Ибо пытаясь семулировать нажатие клавиши при раоте с той же либой win32 вы взаимодействуете с ПК с которого запускается РДП а не компом который в средине сессии!Другими словами, если хотите направление для размышления вам нужно подключится к апи удаленного ПК внутри RDP сессии и уже потом емулировать что вам нужно.Теоретически можно попробовать примянять нажатие ентера на активном окне коим долэен оказаться ваш РДП сеанс - но тут магия
Офлайн
мне кажеться что вы подходите к проблеме не стой стороны, но нужно знать подробнее что вам нужно.
fayst59вы хотите делать какето дейтвия в РДП сессии на удаленом рабочем столе, или у вас стоит проблема автоматизации ввода логина-пароля??
Мой скрипт открывает RDP (Удаленный рабочий стол) на винде, делает окно активным и нажимает клавишу Return (Enter)
[code python][/code]
Офлайн
если просто автоматизация ввода логина пароля, то все делаеться на раз-два-три
либо используеться сторонний РДП клиент типа RDP Plus, который понимает в аргументах командной строки лоигн-пароль, либо через последовательный запуск через subprocess, win32api.ShellExecute или win32process.CreateProcess
cmdkey /generic:“server name or IP” /user:“username” /pass:“passwd”
mstsc /v:“server name or IP”
cmdkey /delete:“server name or IP”
если надо чтото посылать в уже работающую RDP сесию то это умеет AutoIT( может еще кто, наверняка, но я не искал)
для работы с AutoIT есть такая обертка https://pypi.python.org/pypi/PyAutoIt/0.3 но я ее не пробовал, так как она только для второй ветки
Также нашел PyAutoItPy https://github.com/AhonVashibaka/PyAutoItPy
по сути тоже обертка для работы с AutoItX3.dll
Нижеприведенный код ищет окно с активным РДП сеансом по имени заголовка окна, деает его активным, запускает cmd.exe и в нем выводит таблицу маршрутизации коммандой route print.
import time from os import system from PyAutoItPy import AutoItX, WinHandle def main(): Automat=AutoItX() #Ищем окно РДП сеанса по заголовку Title='[TITLE:192.168.16.225 - Подключение к удаленному рабочему столу]' """ Специальное установки могут быть использованы в качестве параметра title в функциях работы с окнами. Эти установки могут быть использованы, чтобы отличить окна по следующим свойствам: TITLE - Заголовок окна CLASS - Внутреннее название класса окна REGEXPTITLE -Заголовок окна (с использованием регулярных выражений, если регулярное выражение составлено неверно, значение @error будет установлено равным 2) REGEXPCLASS - Название класса окна (с использованием регулярных выражений, если регулярное выражение составлено неверно, значение @error будет установлено равным 2) ....... (с) Из офф справки по AUtoit https://autoit-script.ru/autoit3_docs/intro/windowsadvanced.htm """ Handle=WinHandle(Automat.WinGetHandle(Title)) if Handle == '[HANDLE:0x00000000]': print('Невозможно получить Handle', Title) exit(-1) Automat.WinActivate(Handle) # делаем окно активным Automat.Send('{LWIN}') time.sleep(1) # задерки нужны изза времени реакции ОС на нажатия клавиш Automat.Send('{UP}') Automat.Send('{UP}') Automat.Send('{UP}') Automat.Send('{ENTER}') time.sleep(1) Automat.Send('cmd') Automat.Send('{ENTER}') time.sleep(1) Automat.Send('route print') Automat.Send('{ENTER}') if __name__ == '__main__': main()
[code python][/code]
Отредактировано PEHDOM (Март 16, 2017 13:02:28)
Офлайн