-
Задача такого плана - на хосте win7 запущена виртуальная машина (какая - не имеет большого значения) с winXP, в которой запущена программа "А". На хосте управляющая программа "Б" должна проэмулировать работу с программой "А". Например, нажатие кнопок клавиатуры.
Если обе программы находятся в одной системе, то это делается легко: PostMessage(HandleProgramA, WM_KEYDOWN, myCode, 0);
Однако, если программа "А" запущена в виртуальной машине, то ничего не получается. PostMessage(HandleVM, WM_KEYDOWN, myCode, 0); никакой реакции в виртуалке не происходит не зависимо от запущенных там программ.
Насколько я понимаю, это связано с тем, что виртуалки не обрабатывают сообщения типа WM_KEYDOWN, а работают с клавиатурой на прямую? Проверял на VMWare и MS VirtualPC.
Каким образом можно решить эту проблему?
-
> Kobik. (29.01.2011 13:59:00) [0]
виртуалки обрабатывают сообщения типа WM_KEYDOWN
-
>Anatoly Podgoretsky © (29.01.11 14:19) [1]
Возможно я не достаточно понятно объяснил ситуацию.
Откроем на хосте notepad. Если делать вышеописанный PostMessage на хендл поля редактирования, то в нем будет печататься текст.
Когда мы смотрим с хоста на окно виртуальной машины, то оно целиком имеет один хендл. Но даже если в виртуалке курсор стоит в блокноте, то PostMessage на хендл окна виртуалки ни к чему не приводит.
-
> это связано с тем, что виртуалки не обрабатывают сообщения типа WM_KEYDOWN, а работают с клавиатурой на прямую? это связано с тем, что "гостевые драйвера" не установлены, без них система внутри "черный ящик" и даже сама оболочка VM с ней ограниченно взаимодействует (мышь внутрь "проваливается" и т.д.).
-
Задача решается функциями 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).
--- У этого решения одна небольшая беда - происходит полная имитация нажатия кнопок, т.е. "послать нажатия" в неактивное окно невозможно. И насколько я понял, решения этой проблемы не существует.
|