Проблема с отправкой ввода по RDP всеми известными способами

Я пишу небольшой клиент, используя WinForms, C#, инструмент AxMsTscNotSafeForScripting, и мне нужно отправить Win+R на виртуальную машину (да, я знаю, есть способ удаленного запуска приложения без RunDialog, но мне нужно). Я быстро нашел хорошую библиотеку с именем InputSimulator, она правильно имитирует все на моей основной машине, но не влияет на виртуальную машину.

На самом деле, он может отправить весь string в блокнот, но когда он имеет дело с VirtualKeyCodes, ничего не происходит. Немного углубившись в Google, я обнаружил использование WindowsAPI.SendInput с методами void PressKey(char ch, bool press) void KeyDown(ushort scanCode) void KeyUp(ushort scanCode).

PressKey работает с ВМ, но KeyDown и KeyUp, которые мне нужны, неверны. Например, 81 — это ScanCode для «Q», но печатается «.» в блокноте 82 для «R», но я получаю «0» и вообще ничего не получаю с 91, это для клавиши Windows. Если я нажимаю клавишу на клавиатуре, все работает, поэтому проблема не в настройках KeyPreview, EnableWindowsKey и т. Д. Обе системы - Win7, Oracle VM VirtualBox.

Даже если мой путь безнадежен, какие еще есть способы программно отправить Win+R на виртуальную машину? Помощь будет принята с благодарностью!


person Amateur    schedule 30.11.2014    source источник
comment
Проблема не в длине вашего вопроса, а в полной неорганизованности. Пожалуйста, отредактируйте. Вы также можете использовать обратные кавычки (``) вокруг кода, чтобы он отображался правильно.   -  person Ben Voigt    schedule 01.12.2014
comment
@BenVoigt Надеюсь, теперь это выглядит лучше, это мой первый вопрос здесь, спасибо за ваш совет, теперь я был бы рад получить ответы, если это возможно.   -  person Amateur    schedule 01.12.2014
comment
Это невероятно лучше.   -  person Ben Voigt    schedule 01.12.2014


Ответы (1)


Причина, по которой PressKey работает, заключается в том, что вы предоставляете ASCII char, который он ожидает.

Причина, по которой KeyDown и KeyUp не работают, заключается в том, что вы все еще предоставляете ASCII value, но они ожидают код сканирования. Коды сканирования отличаются от кодов ASCII. 82 (0x52) не является "R" ни в одном из общие таблицы скан-кодов -- и в таблице 2, и в таблице 3 это цифровая клавиатура 0, что согласуется с наблюдаемым вами поведением.

Вам нужно использовать MapVirtualKey(Ex), чтобы преобразовать код ASCII или код виртуального ключа в скан. код.

Похоже, что "R" равно 0x13 (как в таблице 2, так и в таблице 3), но WinKey имеет разный код в каждой таблице, поэтому вам не следует жестко кодировать значение, а получать его во время выполнения, используя MapVirtualKeyEx.

person Ben Voigt    schedule 01.12.2014
comment
Большое спасибо! Так странно, что я использовал ВК-таблицу вместо такой. Тем не менее, я все еще делаю что-то не так, и на виртуальную машину все еще не прибыл ключ winkey. - person Amateur; 03.12.2014
comment
@Amateur: Что MapVirtualKeyEx сказал вам, так это скан-код для ключа Windows? - person Ben Voigt; 03.12.2014
comment
@Amateur: 5B действительно появляется в этой таблице для ключа Windows ... но как E0,5B (расширенный ключ). Попробуйте отправить либо 0xE05B, либо два ключа, 0xE0, а затем 0x5B. - person Ben Voigt; 05.12.2014