Про работу с чужим приложением

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

Про работу с чужим приложением

Сообщение RazArt » 08.02.2009 (Вс) 22:14

Есть приложение на нем находится RichTextBox, как мне из своей программы посылать ему команды имитирующие нажатие клавиш, например чтобы написать там свой текст?

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Про работу с чужим приложением

Сообщение arthur2 » 09.02.2009 (Пн) 1:32

можно, например, так:
http://forum.sources.ru/index.php?showt ... &p=2151999
Артур
 
   

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Про работу с чужим приложением

Сообщение RazArt » 09.02.2009 (Пн) 8:41

А как узнать хендл текст бокса?

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Про работу с чужим приложением

Сообщение RazArt » 09.02.2009 (Пн) 9:53

Так как получить хендл я разобрался, а вот как послать ему символ, типа нажата клавиша?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Про работу с чужим приложением

Сообщение tyomitch » 09.02.2009 (Пн) 13:50

WM_CHAR, так же, как по ссылке.
Изображение

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Про работу с чужим приложением

Сообщение RazArt » 09.02.2009 (Пн) 14:04

Код: Выделить всё
On Error Resume Next
Dim hwnd As Long
hwnd = FindWindow(vbNullString, "Garena")
EnumChildWindows hwnd, AddressOf WndEnumChildProc, List1
If TextBoxHwnd > 0 Then
Beep
    For x = 0 To 25
        PostMessage TextBoxHwnd, WM_CHAR, &H3A9, 0
        'EnableWindow TextBoxHwnd, 1
    Next x
Else
    MsgBox "<Тут сообщение об ошибке>", vbCritical, AppName
End If

Вот код, я нашёл хендл и посылаю ему сообщения, но ничего не происходит =\
Ах да, класс RichEdit20W

GDK
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 23.10.2008 (Чт) 16:15

Re: Про работу с чужим приложением

Сообщение GDK » 09.02.2009 (Пн) 18:33

А если через буфер обмена вставить текст. Т.е. делаешь чужое окно (RichTextBox) "самым активным" и имитируешь нажатие клавиш Ctrl + V. Я так делал при работе с чужой программой. В ней надо было вставить в диалоговое окно типа InputBoxa строку с именем файла. Только перед этим в буфер надо записать эту строчку (что нетрудно). По моему проще, чем каждую буковку вводить.

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Про работу с чужим приложением

Сообщение RazArt » 09.02.2009 (Пн) 18:43

Почему у мну не получается эмитировать нажатия клавиш?
Код: Выделить всё
On Error Resume Next
Dim hwnd As Long
hwnd = FindWindow(vbNullString, "Garena")
EnumChildWindows hwnd, AddressOf WndEnumChildProc, vbNull
If TextBoxHwnd > 0 Then
    For x = 1 To Len(Text1.Text)
        SendMessage TextBoxHwnd, WM_KEYDOWN, Asc(Mid(Text1.Text, x, 1)), 0
        SendMessage TextBoxHwnd, WM_KEYUP, Asc(Mid(Text1.Text, x, 1)), 0
    Next x
Else
    MsgBox "<Тут мессага об ошибке>", vbCritical, AppName
End If

Вернее при этом ничего не происходит...

GDK
Обычный пользователь
Обычный пользователь
 
Сообщения: 80
Зарегистрирован: 23.10.2008 (Чт) 16:15

Re: Про работу с чужим приложением

Сообщение GDK » 09.02.2009 (Пн) 19:30

Да ты не имитируешь нажатия на клавиши, а просто шлёшь сообщения. Причём на которые окно может и не реагировать или реагировать не так как тебе надо. Чтобы имитировать нажатия клавиш я сделал вот как:
1. С помощью функции SetForegroundWindow сделал окно родителя активным для ввода.
2. С помощью не помню какой ф-ции(может тоже SetForegroundWindow) сделал окно потомка активным (в вашем случае это будет RichTextBox).
3. С помощью API keybd_event имитировал нажатие и ОТПУСКАНИЕ нужных клавиш.

если хочешь работать с сообщениями попробуй сделать следующее:
1. Проверь какие сообщения получает при вводе, вставке, вырезке, нажатии разных клавиш и т.п. чужой RichTextBox.
Для этого можно воспользоваться утилитой Spy++, которая есть в комплекте с Visual Studio 6. Ну или подобной утилитой.
2. Ну и попробуй засылать подобные сообщения.
Работа с сообщениями может быть и лучше, т.к. при имитации нажатия клавиш надо дожидаться реакции окна. Если надо ввести 2000 символов и на реакцию выделять 1 миллисекунду то ввод займёт 2 секунды. Косяк, не правда ли?

Да, а Hwnd RichTextBoxа правильно определил?

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Про работу с чужим приложением

Сообщение arthur2 » 10.02.2009 (Вт) 12:58

Мы не ищем лёгких путей? Я же дал тебе ссылку с ГОТОВЫМ РЕШЕНИЕМ :)

Там, правда, опечатка была - я не стёр вызов функции, которой просто не было в приведённом отрывке. Впрочем, я тот топик поправил - сходи ещё раз и забирай.

Установи таймер где-нибудь на 500 и потыкай в разные окна, где есть фокус ввода (и не важно, какого класса :)

Да, и кстати: WM_KEYDOWN оперирует виртуальными клавишами, а они вовсе не равны Asc символов (разве что только для заглавных английских букв) А вот по WM_CHAR можно посылать именно что готовые символы.
Артур
 
   

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Про работу с чужим приложением

Сообщение RazArt » 11.02.2009 (Ср) 16:08

Спс всем, я наконец-то разобрался) Тему слоуз =)


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37

    TopList  
cron