Конференция "WinAPI" » Как передать нажатие клавиши в виртуальную машину?
 
  • Kobik. (29.01.11 13:59) [0]
    Задача такого плана - на хосте win7 запущена виртуальная машина (какая - не имеет большого значения) с winXP, в которой запущена программа "А".
    На хосте управляющая программа "Б" должна проэмулировать работу с программой "А". Например, нажатие кнопок клавиатуры.

    Если обе программы находятся в одной системе, то это делается легко:
    PostMessage(HandleProgramA, WM_KEYDOWN, myCode, 0);

    Однако, если программа "А" запущена в виртуальной машине, то ничего не получается.
    PostMessage(HandleVM, WM_KEYDOWN, myCode, 0);
    никакой реакции в виртуалке не происходит не зависимо от запущенных там программ.

    Насколько я понимаю, это связано с тем, что виртуалки не обрабатывают сообщения типа WM_KEYDOWN, а работают с клавиатурой на прямую? Проверял на VMWare и MS VirtualPC.

    Каким образом можно решить эту проблему?
  • Anatoly Podgoretsky © (29.01.11 14:19) [1]
    > Kobik.  (29.01.2011 13:59:00)  [0]

    виртуалки обрабатывают сообщения типа WM_KEYDOWN
  • Kobik. (29.01.11 17:05) [2]
    >Anatoly Podgoretsky ©   (29.01.11 14:19) [1]

    Возможно я не достаточно понятно объяснил ситуацию.

    Откроем на хосте notepad. Если делать вышеописанный PostMessage на хендл поля редактирования, то в нем будет печататься текст.

    Когда мы смотрим с хоста на окно виртуальной машины, то оно целиком имеет один хендл. Но даже если в виртуалке курсор стоит в блокноте, то PostMessage на хендл окна виртуалки ни к чему не приводит.
  • sniknik © (29.01.11 18:17) [3]
    > это связано с тем, что виртуалки не обрабатывают сообщения типа WM_KEYDOWN, а работают с клавиатурой на прямую?
    это связано с тем, что "гостевые драйвера" не установлены, без них система внутри "черный ящик" и даже сама оболочка VM с ней ограниченно взаимодействует (мышь внутрь "проваливается" и т.д.).
  • Kobik. (03.02.11 12:46) [4]
    Задача решается функциями keybd_event и SendInput (как написано в MSDN - первая заменена второй, у которой больше функционала. Но не суть важно).

    Я их конечно изначально пробовал, но они точно так же работали в хостовом блокноте и не работала в блокноте в виртуалке.
    А причина оказалась в том, что я указывал wVk (virtual-key code), а надо использовать другой параметр функции - wScan (hardware scan code).

    В MSND приведен 1 пример, где оба кода используются одновременно. Но гугл выдает кучу примеров, где используется только wVk, на чем я собственно и прогорел.
    Интересно, что все работает на одном только wScan, т.е. wVk можно брать 0. И это не зависимо от установленности флага KEYEVENTF_SCANCODE (If specified, wScan identifies the key and wVk is ignored).

    ---
    У этого решения одна небольшая беда - происходит полная имитация нажатия кнопок, т.е. "послать нажатия" в неактивное окно невозможно. И насколько я понял, решения этой проблемы не существует.
 
Конференция "WinAPI" » Как передать нажатие клавиши в виртуальную машину?
Есть новые Нет новых   [134431   +11][b:0][p:0]