Как имитировать ввод с клавиатуры на сеанс удаленного рабочего стола? - PullRequest
8 голосов
/ 06 декабря 2008

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

Byte key = Ord("A");

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

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

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

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


Угол Нитпикера

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 06 декабря 2008

Ответ

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

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

В CodeProject есть изображение диаграммы , в которой перечислены коды сканирования для различных ключей:

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

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

2 голосов
/ 25 февраля 2010

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

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
2 голосов
/ 06 декабря 2008

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

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

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

0 голосов
/ 22 ноября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...