Эмуляция нажатий клавиш клавиатуры

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ofolfa
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 11.12.2008 (Чт) 12:41

Эмуляция нажатий клавиш клавиатуры

Сообщение ofolfa » 24.04.2009 (Пт) 3:04

Всем привет!
Только не кричите что тема обсуждалась уже много раз.
Перепробовал все что нашел. Не работает.
Есть виртуальная машина пробовал и с Virtual PC и с Virtual Box.
На вирт машине блокнот, нужно там набрать текст.
Не хочет работать. Помогите!!! Очень нужно, весь день сидел, ничего не придумал (((
Может кто может протестить на своей машине или может подскажите какие способы должные работать.
Пишу на VB.net, но возможны любые решения, даже на VB6.

Зарание всем спасибо!

ofolfa
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 11.12.2008 (Чт) 12:41

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение ofolfa » 24.04.2009 (Пт) 7:36

А можно ли как-то узнать по какому принципу работает экранная клавиатура? Она без проблем отправляем нужные события.

arvitaly
Постоялец
Постоялец
 
Сообщения: 485
Зарегистрирован: 12.04.2009 (Вс) 0:30
Откуда: Казань

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение arvitaly » 24.04.2009 (Пт) 7:58

А нельзя обмениваться данными по сети???

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение Xcode » 24.04.2009 (Пт) 8:09

Где находиться отправляющая команды программа?
arvitaly писал(а):А нельзя обмениваться данными по сети???

С чем? С блокнотом?

ofolfa
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 11.12.2008 (Чт) 12:41

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение ofolfa » 24.04.2009 (Пт) 9:01

Нет, по сети нельзя, можно конечно написать клиент-серверное приложение, но это не тот случай.

Программа находится в другой ОС в которой и запущена Вирт машина с блокнотом.

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

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение Xcode » 24.04.2009 (Пт) 9:24

Что ни SendInput, ни keybd_event, ни SendKeys, ни SendMessage, ни SetKeyboardState не работают так как тебе надо? Может выложишь свои наработки?

ofolfa
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 11.12.2008 (Чт) 12:41

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение ofolfa » 24.04.2009 (Пт) 17:49

Да, все перепробовал, ничего не работает (((
Помогите, очень нужно! (((

Вот последний пример, который остался в проекте
Код: Выделить всё
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer

    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Integer, ByVal hWnd2 As Integer, ByVal lpsz1 As String, ByVal lpsz2 As String) As Integer

    Private Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Integer, ByVal wMapType As Integer) As Integer


    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Const WM_SETTEXT = &HC
        Const WM_KEYDOWN = &H100
        Const WM_KEYUP = &H101
        Const VK_RETURN = &HD

        Dim whwnd As Integer

        Dim hwnd_box As Integer

        Dim comment As String

        comment = "ddddd"

        whwnd = FindWindow(Nothing, "Windows XP [Работает] - Sun xVM VirtualBox")

        hwnd_box = FindWindowEx(whwnd, 0, vbNullString, vbNullString)

        If hwnd_box <> 0 Then
            SendMessage(hwnd_box, WM_SETTEXT, 0, comment)

            Threading.Thread.Sleep(500)

            SendMessage(hwnd_box, WM_KEYDOWN, VK_RETURN, 0)
            SendMessage(hwnd_box, WM_KEYUP, VK_RETURN, 0)

            'this is just to verify that I am catching the child
            TextBox2.Text = hwnd_box
        Else
            SendMessage(whwnd, WM_SETTEXT, 0&, comment)
        End If
    End Sub

ofolfa
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 11.12.2008 (Чт) 12:41

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение ofolfa » 25.04.2009 (Сб) 18:36

Может кому денег предложить за помощь? (((
Очень нужно, не могу понять, в чем проблема. Может кто у себя протестить? Или кинуть примеры?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение iGrok » 25.04.2009 (Сб) 19:00

ofolfa писал(а):Может кому денег предложить за помощь? (((
Очень нужно, не могу понять, в чем проблема. Может кто у себя протестить? Или кинуть примеры?

Погоди. Ты хочешь сказать, что у тебя "Экранная клавиатура" корректно отправляет нажатия клавиш в виртуальную машину? 0_o
label:
cli
jmp label

ofolfa
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 11.12.2008 (Чт) 12:41

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение ofolfa » 25.04.2009 (Сб) 19:22

Да, абсолютно корректно

un1
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.04.2009 (Пн) 19:47

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение un1 » 25.04.2009 (Сб) 22:46

Код: Выделить всё

whwnd = FindWindow(Nothing, "Windows XP [Работает] - Sun xVM VirtualBox")

hwnd_box = FindWindowEx(whwnd, 0, vbNullString, vbNullString)


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


Никогда не работал с виртуальной машиной, соответственно, хэндл чего ты находишь вот этим кодом :

Код: Выделить всё
hwnd_box = FindWindowEx(whwnd, 0, vbNullString, vbNullString) 


не ясно, но этого явно не достаточно, как мне кажется....

По идее, искать надо так:

1.Находишь хэндл окна виртуальной машины (это у тебя вроде как успешно получаетя)
2.Там найти хэндл окна блокнота, не знаю, будет ли достаточно иметь хэндл окна вирт. машины, что бы следующей же функией найти окно блокнота, либо надо еще какой то дескриптор вначале получить

Тут правда не ясно, регистрируются ли окна, висящие в ОС вирт. машины, в твоей операционке...

3.Получив хэндл блокнота, полчучить хэнд его текстового поля, а далее уже посылаем символы

Но это только "по идее", на практике же, какие могут быть подводные камни при работе с вирт. машиной хез... :alien:

ofolfa
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 11.12.2008 (Чт) 12:41

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение ofolfa » 25.04.2009 (Сб) 23:27

Спасибо за ответ!!

1.Находишь хэндл окна виртуальной машины (это у тебя вроде как успешно получаетя)
2.Там найти хэндл окна блокнота, не знаю, будет ли достаточно иметь хэндл окна вирт. машины, что бы следующей же функией найти окно блокнота, либо надо еще какой то дескриптор вначале получить

А как найти хэндл блокнота? Я думаю что никак. Нужно отправить вирт машине сообщение, а она уже сама пусть решает кому его передать.

Код: Выделить всё
hwnd_box = FindWindowEx(whwnd, 0, vbNullString, vbNullString)

Я там понимаю, что этот код отправляем главному окну, а дальше распределение идет автоматически.
С блокнотом работает в обычной винде, хоть и находил пример что нужно писать "Edit" в параметре.

Никаких больше идей нету? (

un1
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.04.2009 (Пн) 19:47

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение un1 » 26.04.2009 (Вс) 0:34

А как найти хэндл блокнота? Я думаю что никак. Нужно отправить вирт машине сообщение, а она уже сама пусть решает кому его передать


:lol: Кому его передать, она безусловно решит, только наврядли это будет блокнот :mrgreen:

Поэтому, как я уже и говорил, проверь, регистрируются ли объекты, находящиеся внутри виртуальной машины, твоей операционкой, если да, то найти там Хэндл блокнота не составит проблемы (функции: FindWindowEx, GetWindow). Если же нет, то тогда, полагаю Send/Post message тут не прокатит...

Проверить мона элементратно Spy ++, стандартная тулза бейсика!!!

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение Xcode » 26.04.2009 (Вс) 1:19

Если честно пол дня потратил на этот вопрос... Пытался изучить принцип работы экранной клавиатуры(далее ЭК) и ВМ(использовал крякнутую VMware 6.0.2 с ReactOS liveCD). Никаких значащих для автора успехов добиться не смог, принцип работы ЭК до конца так и не понял :oops: , ловил вызывемые функции(из exe и всех dll) и конечно сообщения, пробывал сэмулировать последовательность сообщений, ничего не вышло.

Некоторые результаты:
Хэндлы окон виртуальной ОС найти не получается, что логично.
ЭК насколько я понял без хуков не обходится.
Вправду, интересный вопрос по поводу ЭК, в интернете(google) ничего понастоящему аналогичного не нашел, одни только предположения и исходники очевидных мне, но неверных, либо неполных решений.
Пробывал журнальный хук(http://bbs.vbstreets.ru/viewtopic.php?f=15&t=39360), клавиши при активированной ВМ не ловятся.
Вобщем помогайте :)

ofolfa
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 11.12.2008 (Чт) 12:41

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение ofolfa » 26.04.2009 (Вс) 1:27

Спасибо большое, что пытаетесь мне помочь, надеюсь разберусь и кому-то в будущем тоже помогу!
Нашел интересную библиотку, к сожалению платную,
http://www.mini-tools.com/components/input/index.htm

Что самое интересное, так она без проблем отправляет в две мои Виртуальные Машины.
У кого есть идеи, как она работает?
И, к тому же, она отправляет именно в главный хэндл.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение iGrok » 26.04.2009 (Вс) 1:29

un1 писал(а):Тут правда не ясно, регистрируются ли окна, висящие в ОС вирт. машины, в твоей операционке...

Тут, вообще, достаточно просто включить голову. Подумать, к примеру о том, что в ВМ может запускаться другая ОС.. Не Win*. И тогда всё встанет на свои места.

По теме:
Вообще с VirtualBox не работал. Только с WMware. Она, к примеру, при получении фокуса полностью перехватывает ввод. Полностью. Для "реальной машины" работает ТОЛЬКО Ctrl-Alt-Del. А при "потере"(комбинация клавиш, либо CAD) фокуса - деактивируется. Т.е. экранная клавиатура с ней не работает.

А насчёт способа посылки нажатия клавиш в VitrualBox, если экранная клавиатура работает, можно действительно включить Spy++, и посмотреть, что посылается.

З.Ы. Spy++ - не "стандартная тулза бейсика", а скорее "стандартная тулза студии". В комплекте с "чистым" VB6.0 её нет.

UPD:
Mini-Input тоже не смог отправить нажатие в VMware...
Последний раз редактировалось iGrok 26.04.2009 (Вс) 1:38, всего редактировалось 1 раз.
label:
cli
jmp label

ofolfa
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 11.12.2008 (Чт) 12:41

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение ofolfa » 26.04.2009 (Вс) 1:31

Она, к примеру, при получении фокуса полностью перехватывает ввод.

Перехватывает ввод с мышки, но не с клавиатуры. Если активируешь окно и начнешь вводить, будет вводиться в блокноте запущенном на Вирт машине.

ofolfa
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 11.12.2008 (Чт) 12:41

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение ofolfa » 26.04.2009 (Вс) 1:38

Смотрел Spy++ но не понял, как мне применить сообщения которые отправляет ЭК.

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение Xcode » 26.04.2009 (Вс) 1:40

iGrok писал(а):Вообще с VirtualBox не работал. Только с WMware. Она, к примеру, при получении фокуса полностью перехватывает ввод. Полностью. Для "реальной машины" работает ТОЛЬКО Ctrl-Alt-Del.

А вот и работает...

iGrok писал(а):А насчёт способа посылки нажатия клавиш в VitrualBox, если экранная клавиатура работает, можно действительно включить Spy++, и посмотреть, что посылается.

Проделывал это с VMware, не работает, или просто что-то упустил... :roll:

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение iGrok » 26.04.2009 (Вс) 1:54

ofolfa писал(а):
Она, к примеру, при получении фокуса полностью перехватывает ввод.

Перехватывает ввод с мышки, но не с клавиатуры. Если активируешь окно и начнешь вводить, будет вводиться в блокноте запущенном на Вирт машине.

Стоп. Ты вот сейчас о чём?

Я говорил, что вирт. машина (VMware) полностью перехватывает ВЕСЬ ввод. Т.е. все стандартные сочетния клавиш, кроме CAD для "реальной" машины перестают работать. А если я пытаюсь переключиться обратно на экранную клавиатуру - фокус с ВМ уходит.
Возможно, в VirtualBox не так. Не знаю.

Xcode писал(а):А вот и работает...

Что работает?

Xcode писал(а):Проделывал это с VMware, не работает, или просто что-то упустил... :roll:

Ничего не упустил. Это действительно не работает.
label:
cli
jmp label

ofolfa
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 11.12.2008 (Чт) 12:41

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение ofolfa » 26.04.2009 (Вс) 1:56

В VirtualBox так:
Запускаешь блокнот. Уходишь с виртбокса, но окно остается активным, клацаешь на клаве, оно набирает текст в блокноте.
В общем решил, буду юзать библиотеку. Пока кто-то не подскажет другого решения :(

un1
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.04.2009 (Пн) 19:47

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение un1 » 26.04.2009 (Вс) 2:04

В VirtualBox так:
Запускаешь блокнот. Уходишь с виртбокса, но окно остается активным, клацаешь на клаве, оно набирает текст в блокноте.
В общем решил, буду юзать библиотеку. Пока кто-то не подскажет другого решения


Если ты все это время пытался послать сообщение окну (Sendmessage), попробуй вначале что нибудь типа keybd_event (API функция) либо SendKeys, так полюбе должно работать, если окно активное...

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение Xcode » 26.04.2009 (Вс) 2:12

iGrok писал(а):Xcode писал(а):А вот и работает... Что работает?

Сорри, туплю, ночь уже и поддатый слегка. Я имел ввиду что при щелчке мышкой по кнопкам ЭК, при условии что курсор остается в области блокнота ВМ-ы, в блокноте появляются соответствующие символы.
iGrok писал(а):Ничего не упустил. Это действительно не работает.

Я проверял так: запускал логер сообщений, жал кнопки на ЭК, приходили соответствующие сообщения. Но на посылку их тому же окну из своей программы оно не реагировало.

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение Xcode » 26.04.2009 (Вс) 2:16

un1 писал(а):Если ты все это время пытался послать сообщение окну (Sendmessage), попробуй вначале что нибудь типа keybd_event (API функция) либо SendKeys, так полюбе должно работать, если окно активное...

А ты возьми и проверь вместо "полюбе", я тоже так думал сначала.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение iGrok » 26.04.2009 (Вс) 2:21

Xcode писал(а):
iGrok писал(а):Xcode писал(а):А вот и работает... Что работает?

Сорри, туплю, ночь уже и поддатый слегка. Я имел ввиду что при щелчке мышкой по кнопкам ЭК, при условии что курсор остается в области блокнота ВМ-ы, в блокноте появляются соответствующие символы.

Ох ты ж ё..
Наконец-то удалось заставить экранку работать.
Она отправляла символы ТОЛЬКО тогда, когда находилась непосредственно над окном VMware. Первые два раза я пробовал, уведя ЭК вниз экрана - под окно ВМ. И при нажатии на клавишу ЭК ВМ теряла фокус, и ввод не принимала.

Похоже, ВМ принимает действия мыши/клавиатуры только тогда, когда имеет фокус.

Xcode писал(а):А ты возьми и проверь вместо "полюбе", я тоже так думал сначала.

Он просто, похоже, до сих пор не понял, что такое ВМ...

UPD:
Mini-Tools работает через SendInput.

UPD2:
Охх.. Не только.
Короче, пиши как пользуешься Mt, я напишу, как оно это делает. Или сам смотри в рефлекторе.
Там есть и вариант с keybd_event, но в связке с Attach/DetachThreadInput.. И многое другое.
Последний раз редактировалось iGrok 26.04.2009 (Вс) 2:46, всего редактировалось 1 раз.
label:
cli
jmp label

un1
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.04.2009 (Пн) 19:47

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение un1 » 26.04.2009 (Вс) 2:42

Он просто, похоже, до сих пор не понял, что такое ВМ...


... ммм и что же это ?

А ты возьми и проверь вместо "полюбе", я тоже так думал сначала.


Ставить ВМ влом :drunken:

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение iGrok » 26.04.2009 (Вс) 2:50

un1 писал(а):... ммм и что же это ?

Судя по тому, что "должно полюбэ работать", тот факт, что ты знаешь, что такое "Виртуальная машина" ещё ни о чём не говорит. :roll:

И если ты таки понимаешь, то отгда откуда взялось предположение о том, что окна гостевой системы "регистрируются" в основной системе? :wink:
label:
cli
jmp label

un1
Начинающий
Начинающий
 
Сообщения: 7
Зарегистрирован: 20.04.2009 (Пн) 19:47

Re: Эмуляция нажатий клавиш клавиатуры

Сообщение un1 » 26.04.2009 (Вс) 2:57


Судя по тому, что "должно полюбэ работать", тот факт, что ты знаешь, что такое "Виртуальная машина" ещё ни о чём не говорит.

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


Вывод справедливый :wink: Правда, я сразу на счет этого оговорился:

Никогда не работал с виртуальной машиной, соответственно, хэндл чего ты находишь вот этим кодом :


поэтому смысла в этих рассуждениях нет :roll:


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 75

    TopList