Альтернатива SendKeys при запуске через удаленный рабочий стол? - PullRequest
23 голосов
/ 16 июля 2009

У меня есть приложение, которое вводит нажатия клавиш в приложения через SendKeys.

К сожалению, приложение не будет работать, когда я запускаю его через удаленный рабочий стол из-за известной проблемы, что SendKeys не работает с удаленным рабочим столом.

Кто-нибудь решал эту проблему раньше или у вас есть какие-либо хорошие предложения по ее решению?

Ответы [ 4 ]

9 голосов
/ 26 августа 2011

SendKeys не подходит, в основном из-за:

  • Он может отправлять ключи только активному / целевому приложению, которое никогда не будет работать гарантированно, поскольку активное приложение может переключаться между временем фактической отправки ключей.
  • RDP и многие другие библиотеки (например, DirectX) блокируют их в основном по соображениям безопасности.

Лучшие альтернативы:

Пример кода с использованием SendMessage:

HWND hwndNotepad = FindWindow(_T("Notepad"), NULL);
HWND hwndEdit = FindWindowEx(hwndNotepad, NULL, _T("Edit"), NULL);
SendMessage(hwndEdit, WM_SETTEXT, NULL, (LPARAM)_T("hello"));
2 голосов
/ 30 марта 2013

В моем случае я успешно использовал WinAPI SendInput с кодами сканирования оборудования. Похоже, что SendKeys отображает символы для сканирования кодов неправильно.

2 голосов
/ 07 сентября 2011

Чтобы обойти проблему RDP, необходимо всегда войти в систему на рабочем столе (или настроить автоматический вход при каждой загрузке).

И даже при автоматическом входе в систему, если вам когда-либо понадобится доступ к удаленному рабочему столу для запуска автоматизации, управления системой и т. Д., Предпочтительным методом является использование VNC для удаленного доступа, а не RDP. Причина в том, что VNC является кроссплатформенным, и вы не столкнетесь с этой проблемой RDP. VNC работает как ретранслятор вашего фактического рабочего стола (сеанс консоли RDP 0 или «голова» машины), недостатком является то, что один удаленный сеанс за раз (или у вас у всех один и тот же рабочий стол + клавиатура + мышь). VNC будет работать и для виртуальных машин. Используйте VNC вместо RDP или локального (RDP) доступа из программного обеспечения менеджера виртуальных машин (VMWare / Hyper-V / Xen).

Единственное, на что следует обращать внимание при использовании VNC, так это на том, что рабочий стол не настроен на автоматическую блокировку в режиме ожидания или на заставку, что также может помешать запуску ключей отправки и автоматизации графического интерфейса, поэтому обязательно отключите это. Заставка и энергосбережение монитора в порядке, только без автоматической блокировки и защиты паролем.

ПРИМЕЧАНИЕ. Я не уверен, но верю, что поскольку VNC ретранслирует рабочий стол «как есть», он аналогичен локальному выполнению с точки зрения приложения / системы, поэтому теоретически он также должен быть в состоянии обмануть система / приложение, которое не позволяет SendKeys через RDP. У меня не было проблем с использованием этого метода VNC для AutoIt + SendKeys, независимо от того, был ли я активно подключен через VNC или отключен (sendkeys / Automation все еще продолжает работать после отключения, потому что на реальном рабочем столе он все еще вошел в систему, только VNC не активный).

1 голос
/ 29 августа 2011

В моем случае я использовал sendkeys как часть автоматизации тестирования. Это не будет работать с моей машины сборки, где агент сборки работает по протоколу удаленного рабочего стола. Я не рад этому, но я смог пропустить этот тест как часть моих автоматических сборок.

Использование вызовов Win32 для отправки оконных сообщений может работать, если у меня есть время, я могу попробовать это когда-нибудь.

В любом случае, вот проверка, выполняется ли текущий код в сеансе удаленного рабочего стола:

System.Environment.GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-")
...