API: Как найти абсолютно все элементы окна?

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

API: Как найти абсолютно все элементы окна?

Сообщение EvgenS » 10.12.2007 (Пн) 16:28

Привет всем,

при помощи VB необходимо нажать кнопки в окне программы.
В одном из окон (child) программы есть 2 кнопки, которые не определяюся как Child окна ничем. WinSpy ++ дает инфу только о самом окне. Его класс ATL:33EA44B0.
Так как элементы не доступны, то нет ни их hWnd, ни Control ID.
Соответственно никак SendDlgItemMessage.
Сами кнопки служат для: 1. - export report 2. - print report.


Как определить параметры этих окон (кнопок), чтобы нажать их с помощью SendDlgItemMessage? Может что-то с Visual styles, потому что они отображены практически так же как и в примере [url] http://msdn2.microsoft.com/en-us/library/bb773187.aspx

Все другие окна и их элементы легко определяются как через VB так и WinSpy.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 10.12.2007 (Пн) 16:35

Эм. А ты пробовал EnumChildWindows?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 10.12.2007 (Пн) 16:59

Если Spy++ видит там только одно окно, значит оно и и правда одно, а кнопки отрисовываются кодом.
Забудь про hWnd кнопок. Эмулируй клик мышкой.
Lasciate ogni speranza, voi ch'entrate.

EvgenS
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.12.2007 (Пн) 15:39
Откуда: Санкт-Петербург

Сообщение EvgenS » 10.12.2007 (Пн) 17:17

Thinker,
спасибо за быстрый отклик. Нет, EnumChildWindows я не пользовался.
мой способ до сих пор остается более примитивным - когда я нахожу то окно, в котором отображены эти кнопки, я просто
lngWndChild = GetWindow32(lngWndChild, GW_CHILD)
а оно = 0!. Думаешь будет смысл пробовать EnumChildWindows? Я его еще не освоил, к стыду признаюсь.

Alibek!

не подскажешь как его сэмулировать?

Заранее благодарен.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 10.12.2007 (Пн) 17:21

EvgenS
Послать соотв. сообщение.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

EvgenS
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.12.2007 (Пн) 15:39
Откуда: Санкт-Петербург

Сообщение EvgenS » 10.12.2007 (Пн) 17:32

Хакер,

SendMessage и SendDlgItemMessage требуют hWnd окна. Ок! Оно у меня есть, но SendMessage кликнет окно, что толку? А SendDlgItemMessage требует id, которого нет. Следовательно вопрос: а как эмулировать клик по другому?
Спасибо за любую помощь в этом вопросе. Может код есть? Или хоть подскажи в каком направлении копать.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 10.12.2007 (Пн) 17:36

mouse_event, например.
Lasciate ogni speranza, voi ch'entrate.

EvgenS
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.12.2007 (Пн) 15:39
Откуда: Санкт-Петербург

Сообщение EvgenS » 10.12.2007 (Пн) 17:46

Alibek,

огромное спсибо за подсказку. Пороюсь на сайте http://msdn2.microsoft.com

Но все же, если есть что-то более готовое, пример какого-нибудь эмулированного клика, скажем, не затруднит здесь Copy-Paste?
Дабы не убивать жаждущим знаний о mouse_event часов на поиск параметров фунции и правильного их преминения.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 10.12.2007 (Пн) 17:47

EvgenS писал(а):Thinker,
спасибо за быстрый отклик. Нет, EnumChildWindows я не пользовался.
мой способ до сих пор остается более примитивным - когда я нахожу то окно, в котором отображены эти кнопки, я просто
lngWndChild = GetWindow32(lngWndChild, GW_CHILD)
а оно = 0!. Думаешь будет смысл пробовать EnumChildWindows? Я его еще не освоил, к стыду признаюсь.


Thinker -- звание, а по нику - BV :)
Если Spy++ не отобразил дочерние окна в списке окон -- смысла нет. Просто поиск Spy++ не фиксирует некоторые окна пользовательских классов.

Что же касается эмуляции, думаю, alibek имел ввиду mouse_event.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 10.12.2007 (Пн) 17:47

А форум неслабо так глючит... Сообщение отправлялось минут 5...
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

EvgenS
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.12.2007 (Пн) 15:39
Откуда: Санкт-Петербург

Сообщение EvgenS » 10.12.2007 (Пн) 17:57

BV,

прошу прощения. Скосоглазил.
Spy++ не находит ни одного Child окна. В этом то вся и беда.
Mouse_event: нет ли полезных ссылок или старого завалявшегося кода, который не жалко? Хотя бы что-то подобное?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 10.12.2007 (Пн) 18:09

SendMessage и SendDlgItemMessage требуют hWnd окна. Ок! Оно у меня есть, но SendMessage кликнет окно, что толку?

Вот и кликай окно в том месте, где находится нарисованная кнопка. И не надо mouse_event.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

EvgenS
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.12.2007 (Пн) 15:39
Откуда: Санкт-Петербург

Сообщение EvgenS » 10.12.2007 (Пн) 18:42

Хакер,

идея замечательная. Пробовал. Но что-то не так. Не кликает.
WinSpy дает координаты окна. Я и их пробовал в параметрах. Если это должно работать, то подскажи пож. что не так?

после того как окно нашлось:
пробовал разные варианты
SendMessage lngWndChild, BM_CLICK, 1, 1
SendMessage lngWndChild, BM_CLICK, 1, -1
SendMessage lngWndChild, BM_CLICK, 105, 205

105 и 205 - координаты окна, которые дает WinSpy++

что не так?

Я полагаю, что клик не будет работать если запускать через VB и построчно F8?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 10.12.2007 (Пн) 18:51

Ууу...

lParam и wParam должны быть равны 0.

WM_LBUTTONUP, WM_LBUTTONDOWN надо слать, передавая коордианты в lParam-е.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

EvgenS
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.12.2007 (Пн) 15:39
Откуда: Санкт-Петербург

Сообщение EvgenS » 10.12.2007 (Пн) 22:55

Хакер,

вот мой пример:

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

DaWord = MakeDWord(X, Y)

SendMessage iw, WM_LBUTTONDOWN, 0, ByVal DaWord
SendMessage iw, WM_LBUTTONUP, 0, ByVal DaWord

Private Function MakeDWord(ByVal LoWord As Integer, ByVal HiWord As Integer) As Long
MakeDWord = (HiWord * &H10000) Or (LoWord And &HFFFF&)
End Function


но клика не получается.

EUGY
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 214
Зарегистрирован: 09.11.2006 (Чт) 22:51
Откуда: Мурманск

Сообщение EUGY » 11.12.2007 (Вт) 3:41

EvgenS писал(а):
105 и 205 - координаты окна, которые дает WinSpy++ ...

...

DaWord = MakeDWord(X, Y) ...


В lParam надо бы засунуть координаты "кнопки" относительно клиентской области окна.

EvgenS
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.12.2007 (Пн) 15:39
Откуда: Санкт-Петербург

Сообщение EvgenS » 11.12.2007 (Вт) 10:01

EUGY,

клиентская область окна 50х27. Кнопка находится в левой части прямоугольника. Я пробовал разные варианты в этих пределах. Не работает. Я что-то упускаю, но где, понять не могу.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 11.12.2007 (Вт) 14:10

EvgenS
Всё зависит от того, как WindowProc окна отслеживает нажатие. Возможно, тамошний код не смотрит на lParam а вызывает GetCursorPos. Либо при приёме WM_MOUSEMOVE сохраняет координаты.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

EvgenS
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.12.2007 (Пн) 15:39
Откуда: Санкт-Петербург

Сообщение EvgenS » 11.12.2007 (Вт) 14:48

Хакер,

тогда как с этим быть?

EvgenS
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.12.2007 (Пн) 15:39
Откуда: Санкт-Петербург

Сообщение EvgenS » 11.12.2007 (Вт) 14:59

Хакер,

я пробовал ставить курсор точно там, где находится кнопка с помощью SetCursorPos, предварительно поместив окно поверх всех BringWindowToTop. Ничего. Уж не знаю, что и делать.

EvgenS
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.12.2007 (Пн) 15:39
Откуда: Санкт-Петербург

Сообщение EvgenS » 11.12.2007 (Вт) 15:24

Alibek, VB

mouse_event оказался наиболее простым и надежным способом. Все работает.

Хакер,

чтобы добить это дело при помощи SendMessage надо бы подучиться.

Всем огромное спасибо!

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 11.12.2007 (Вт) 16:23

Только я не VB, я BV, да :)
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

EvgenS
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 10.12.2007 (Пн) 15:39
Откуда: Санкт-Петербург

Сообщение EvgenS » 11.12.2007 (Вт) 17:14

:lol: Сорри, BV, уж очень легко спутать


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

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

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

    TopList