Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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