Найти - Пользователи
Полная версия: Отправка команд напрямую с клавиатуры
Начало » Python для экспертов » Отправка команд напрямую с клавиатуры
1
fayst59
Добрый день форумчане!
При выполнении определенной задачи по автоматизации столкнулся с ниже указанной проблемой.
Мой скрипт открывает RDP (Удаленный рабочий стол) на винде, делает окно активным и нажимает клавишу Return (Enter). Загвоздка заключается в том что все эмуляторы клавиатуры которые я перепробовал (а именно Sendkeys, win32api, ctypes, pyuserinput, pykeyboard и т.п), отправляют команду нажатия клавиши не якобы физически, а системно. Соответственно RDP не распознает нажатую клавишу, т.к. удаленный рабочий стол может считывать либо команды из своей системы, либо с подключенной клавиатуры физически.
Каким макаром мне обмануть хитросплетение этих двух систем и заставить скрипт нажимать эмулировать нажатие клавиш физически?
З.Ы. Заранее благодарен за ответы, буду рад если существуют библиотеки занимающиеся подобной ересью.
ZerG
Никаким. Уже много раз подымалась данная тема на форуме.
Ибо пытаясь семулировать нажатие клавиши при раоте с той же либой win32 вы взаимодействуете с ПК с которого запускается РДП а не компом который в средине сессии!
Другими словами, если хотите направление для размышления вам нужно подключится к апи удаленного ПК внутри RDP сессии и уже потом емулировать что вам нужно.

Теоретически можно попробовать примянять нажатие ентера на активном окне коим долэен оказаться ваш РДП сеанс - но тут магия
fayst59
ZerG
Никаким. Уже много раз подымалась данная тема на форуме. Ибо пытаясь семулировать нажатие клавиши при раоте с той же либой win32 вы взаимодействуете с ПК с которого запускается РДП а не компом который в средине сессии!Другими словами, если хотите направление для размышления вам нужно подключится к апи удаленного ПК внутри RDP сессии и уже потом емулировать что вам нужно.Теоретически можно попробовать примянять нажатие ентера на активном окне коим долэен оказаться ваш РДП сеанс - но тут магия
Спасибо! Появилась мысль каким нибудь способом перехватить пакеты с клавиатуры, но тут уже начинаются танцы с бубном, не иначе.
PEHDOM
мне кажеться что вы подходите к проблеме не стой стороны, но нужно знать подробнее что вам нужно.
fayst59
Мой скрипт открывает RDP (Удаленный рабочий стол) на винде, делает окно активным и нажимает клавишу Return (Enter)
вы хотите делать какето дейтвия в РДП сессии на удаленом рабочем столе, или у вас стоит проблема автоматизации ввода логина-пароля??
PEHDOM
если просто автоматизация ввода логина пароля, то все делаеться на раз-два-три
либо используеться сторонний РДП клиент типа 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()
естественно вы должны понимать что АутоИт не сможет заглянуть за окно РДП сенса. Тоесть вы не сможете получить хендл окна в РДП сеансе.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB