Как имитировать ввод с клавиатуры в сеанс удаленного рабочего стола?

StackOverflow https://stackoverflow.com/questions/345147

Вопрос

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

Byte key = Ord("A");

keybd_event(key, 0, 0, 0); // key goes down
keybd_event(key, 0, KEYEVENTF_KEYUP, 0); // key goes up

Теперь этот код отправляет символ "a" в любое локальное окно, но он не будет отправлен в окно удаленного рабочего стола.

Это означает, что я использую Удаленный рабочий стол для подключения к серверу, а затем открываю Блокнот на этом сервере.Если я вручную нажимаю клавиши на клавиатуре:они отображаются в окне редактора Notepad.Но поддельный ввод с клавиатуры keybd_event не приводит к появлению букв "а" в Блокноте.

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


Угол Придирок

В данном конкретном случае я хочу сделать это, потому что я пытаюсь преодолеть тайм-аут простоя.Но с тем же успехом я мог бы попытаться

  • выполнение тестов автоматизации пользовательского интерфейса
  • Стресс-тесты пользовательского интерфейса
  • Тесты на поиск неисправностей пользовательского интерфейса
  • Модульные тесты пользовательского интерфейса
  • Тесты ввода данных пользовательского интерфейса
  • Тесты рисования пользовательского интерфейса
  • или тесты на отказоустойчивость пользовательского интерфейса.

Другими словами, причины, по которым я этого хочу, не важны

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

Это было полезно?

Решение

Ответ

Хотя Microsft говорит, что вам не нужно, и вы не должны, отправьте OEM-код, вам нужно отправить OEM-коды сканирования.В этом примере мне нужно отправить OEM-коды сканирования для

  • клавиша A опускается
  • клавиша А поднимается вверх

Существует изображение диаграммы в CodeProject в нем перечислены коды сканирования make и break для различных ключей:

alt text

В моем случае исходные вызовы keybd_event необходимо изменить на:

Byte key = Ord("A");

keybd_event(key, 0x1E, 0, 0); // key goes down
keybd_event(key, 0x9E, KEYEVENTF_KEYUP, 0); // key goes up

я протестировал это, и это работает.Так что все хорошо.

Другие советы

Может быть, вы сможете выполнить автоматический запуск сценарий с PsExec, облегченная замена telnet, которая позволяет выполнять процессы в других системах, в комплекте с полной интерактивностью консольных приложений, без необходимости вручную устанавливать клиентское программное обеспечение.

(AutoIt вполне способен отправлять любой сигнал (клавиши или другой) в любое оконное приложение и может быть запущен с помощью PsExec на удаленном рабочем столе)

Скрипт автоматического запуска, подобный Спаситель убийств, например, предназначен для перемещения мыши, чтобы избежать длительного простоя на компьютере!

Это сработало очень хорошо, спасибо вам.Для того чтобы получить код сканирования клавиатуры, можно использовать:

int scan;
scan = MapVirtualKey(key & 0xff, 0);
keybd_event(key, scan, 0, 0); // key goes down
keybd_event(key, scan | 0x80, KEYEVENTF_KEYUP, 0); // key goes up

Вы могли бы использовать SendMessage();Это действительно гораздо лучший симулятор для ключей.Что ж, удачи вам в этом!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top