Нажать кнопку в "чужом" приложении

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

Нажать кнопку в "чужом" приложении

Сообщение v000v » 04.05.2005 (Ср) 9:03

Всем здрасти!

Вопрос:
Необходимо из своей программы нажать кнопку в "чужом" окне.
В иерархии, кнопка находится: Parent1 -> Parent2 ... -> ParentN: Button.
Дескриптор кнопки имеется, дескрипторы всех Parent'ов тоже. Определяются правильно.
Пробовал следующие конструкции:

1)
Const BM_CLICK = &HF5

lPar = SendMessage(хэндлКнопки, BM_CLICK, 0, ByVal 0&) возвращает ноль

2)
Нашел пример на Дельфи
SendMessage(ParentN,WM_Command,MakeWParam(IdBtn,BN_CLICKED),HndBtn);

как перевести макрос MakeWParam (выполняет конкатенацию строк) на VB?
Также нашел подобное применение функции SendMessage для выполнения UNDO:

SendMessage Edit1.hwnd, WM_COMMAND, &HE12B * 65536, 0
пробовал переделать под свои нужды, не получается

Как же нажать эту кнопку?
Если можно порядок действий, можно без кода.

Спасибо.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.05.2005 (Ср) 9:24

Запусти Spy++, разыщи свою кнопку, посмотри какие сообщения она получает при нажатии, намылитьсмытьповторить.
А для начала попробуй SendMessage hwnd, 256, 115, 0
Лучший способ понять что-то самому — объяснить это другому.

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

Re: Нажать кнопку в "чужом" приложении

Сообщение tyomitch » 04.05.2005 (Ср) 10:04

v000v писал(а):Нашел пример на Дельфи
SendMessage(ParentN,WM_Command,MakeWParam(IdBtn,BN_CLICKED),HndBtn);

как перевести макрос MakeWParam (выполняет конкатенацию строк) на VB?

Это ты хорошо загнул с конкатенацией... MakeWParam(a, b) - то же самое, что a + 65536 * b
Изображение

v000v
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 23.04.2005 (Сб) 19:06

Сообщение v000v » 04.05.2005 (Ср) 12:15

tyomitch
Это ты хорошо загнул с конкатенацией... MakeWParam(a, b) - то же самое, что a + 65536 * b [/quote]


Это понятно... Почему
SendMessage(ParentBut, WM_COMMAND, IdBtn & 65536 * BN_CLICKED, FirstBut) не работает?

Antonary
SendMessage hwnd, 256, 115, 0 не работает

Spy++ показывает следующее:
WM_MOUSEACTIVATE hwndTopLevel: 000500B8 nHittest:HTCLIENT uMsg: WM_LBUTTONDOWN

WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE

ну и еще много чего, которое, как я понял является уже производным "клика" (открывается новое окно, меняются его размеры и т.п.)

Теперь, зная все это мне что нужно в своей программе воспроизвести тоже самое?
Что значит nHittest и fuActivate?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.05.2005 (Ср) 12:37

v000v писал(а):Это понятно... Почему
SendMessage(ParentBut, WM_COMMAND, IdBtn & 65536 * BN_CLICKED, FirstBut) не работает?

Судя по всему, совсем не понятно.
Ты хоть обратил внимание на то, что именно написал Тёмыч в качестве MakeWParam?

v000v писал(а):Что значит nHittest и fuActivate?

Это не те сообщения, которые тебе нужны.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.05.2005 (Ср) 13:25

Пардон насчет 256, 115, это для комбобокса, чтобы дропдаун вылез.

На самом деле тебе придется методом тыка перебирать события, потому что неизвестно на какое из них срабатывает собственно клик. Например в VB Command1_Click срабатывает только когда отпустишь кнопку, поэтому WM_LBUTTONDOWN не прокатывает. Попробуй послать сообщение о нажатии ентера или пробела.
Лучший способ понять что-то самому — объяснить это другому.

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 04.05.2005 (Ср) 13:34

Antonariy

В виндовс приложениях по дефолту срабатывает когда отпускаешь кнопку. Именно это считается кликом. А срабатывание при нажатии кнопки - извращение. На крайняк можно сначала послать нажать, потом - отпустить.
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.05.2005 (Ср) 14:06

kirrun

В любом случае, WM_LBUTTONDOWN и WM_LBUTTONUP не работают.
Лучший способ понять что-то самому — объяснить это другому.

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 04.05.2005 (Ср) 14:11

хм.. странно...
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 04.05.2005 (Ср) 14:11

(c)API-Guide

Код: Выделить всё
'Before you start this program, I suggest you save everything that wasn't saved yet.
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Const MOUSEEVENTF_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4
Const MOUSEEVENTF_MIDDLEDOWN = &H20
Const MOUSEEVENTF_MIDDLEUP = &H40
Const MOUSEEVENTF_MOVE = &H1
Const MOUSEEVENTF_ABSOLUTE = &H8000
Const MOUSEEVENTF_RIGHTDOWN = &H8
Const MOUSEEVENTF_RIGHTUP = &H10
Private Sub Form_Activate()
    'KPD-Team 1998
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Do
        'Simulate a mouseclick on the cursor's position
        mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0&, 0&, cButt, dwEI
        DoEvents
    Loop
End Sub

kirrun
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 514
Зарегистрирован: 06.04.2005 (Ср) 15:41
Откуда: Питер

Сообщение kirrun » 04.05.2005 (Ср) 14:17

О! Пришел умный человек и всех рассудил =)
"Единственный безопасный компьютер - это тот, который выключен из электросети, закрыт в сейфе, который зарыт 20 футов под землей в засекреченной местности. И то я не уверен относительно его безопасности."
(Деннис Хьюджес, ФБР)

v000v
Начинающий
Начинающий
 
Сообщения: 22
Зарегистрирован: 23.04.2005 (Сб) 19:06

Сообщение v000v » 04.05.2005 (Ср) 19:49

Konst One

Спасибо!

Проще некуда!


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

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

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

    TopList