Альтернатива SendKeys при запуске через удаленный рабочий стол?

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

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

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

4 ответа

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"));

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

Вы можете обойти проблему с 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 не активный).

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

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

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

System.Environment.GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-")
Другие вопросы по тегам