ger_kar писал(а):а засада в том что контрол то не один
Ну так то оно бы хорошо конечно было, но как его реализовать? Зато я знаю как можно изменить поведение конкретного окна, применив субклассинг, после чего добавить реакцию окна на нужные мне оконные сообщения.Qwertiy писал(а):А тебе не кажется, что если с контролом что-то не то, то это надо менять для всех его экземпляров в приложении, а не для одного?
А можно чуть более подробно?Хакер писал(а):По координатам.
ger_kar писал(а):А можно чуть более подробно?
ger_kar писал(а):Т.е. находить окно, сравнить его координаты с координатами контрола, если совпадают, то оно, если не совпало, не оно и дальнейший поиск?
ger_kar писал(а):Может лучше в отладчике найти место где контрол хендл хранит, высчитать смещение и брать оттуда? Будет конечно небольшой блек-кодинг, но зато все будет быстро и без лишних движений?
Ну конечно хотелось бы по уму . А что за умный алгоритм, мне кроме того, что я написал другое ничего в голову не идет?Хакер писал(а):Но по-уму — алгоритм другой.
ger_kar писал(а):Ну конечно хотелось бы по уму . А что за умный алгоритм, мне кроме того, что я написал другое ничего в голову не идет?
Хакер писал(а):Прочитай оду лени и об обновлении списка правильным методом. Обновление списка тут не причём, однако алгоритмическая проблема — та же.
Почему одно? Если бы было одно, то и проблемы бы не было. Окон может быть несколько, по количеству контролов но в основном это 2 окна.Qwertiy писал(а):Тоже не понимаю. Окно одно, найти его надо один раз.
ger_kar писал(а):Почему одно?
а если нет, то бери вообще все свои.ger_kar писал(а):Зато я знаю как можно изменить поведение конкретного окна
Хакер писал(а):Querty, как ты предлагаешь это делать? Может я чего-то не понимаю в Windows API ? Покажи хотя бы псевдокодом.
ger_kar писал(а): Почему одно?
Qwertiy писал(а):Если нужен только один контрол, то представляю примерно так.
Хакер писал(а):Худший способ это делать: обходить элементы первого множества и для каждого элемента из первого множества делать перебор всех элементов второго множества, пока не будет найден соответствующий элемент.
Хакер писал(а):Лучший способ, это то, что я называл «методом двух курсоров» в топике об обновлении списка.
Хакер писал(а):Если один, то да. Но ведь в данном случае ситуация не та.
Qwertiy писал(а):А как насчёт методов с использованием хешей?
Если процесс чужой - банально не получится. Если свой - зачем огород городить с FindWindow?ger_kar писал(а): банально его засубклассить
Процесс родной. И почему интересно FindWindowEx это огород? Я думаю что с EnumChildWindows будет гораздо хуже, так как будут перечисляться все дочерние окна.ark писал(а):Если процесс чужой - банально не получится. Если свой - зачем огород городить с FindWindow?
ark писал(а):Чем отличается НУЖНЫЙ контрол от остальных? Координатами? Текстом? Ещё какой-нибудь фичей?
1. Так координаты нужного контрола известны заранее? http://msdn.microsoft.com/ru-ru/library ... 58(v=vs.85).aspxger_kar писал(а):И почему интересно FindWindowEx это огород
ark писал(а):1. Так координаты нужного контрола известны заранее? http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms633558(v=vs.85).aspx
ark писал(а):2. Хэндл у контрола есть, и скорее всего, хранится для внутреннего пользования где-нибудь сразу за VTABLE. Попробуй посмотреть первые 100-200 байт за ObjPtr
Ну, так есть ChildWindowFromPoint(Ex)Qwertiy писал(а):такие функции возвращают видимое окно
Надо попробовать. Идея мне нравится. А по хендлу окна можно получить наименование оконного класса? Если да, то какой функцией?ark писал(а):Ну, так есть ChildWindowFromPoint(Ex)
ger_kar писал(а):А по хендлу окна можно получить наименование оконного класса? Если да, то какой функцией?
Как вариант, WH_CBT, например.Qwertiy писал(а):Ну если хук повесить
Вот собственно сам контрол , там событий как кот наплакал , всего ничего :ark писал(а):Кстати, а события у контрола есть? Resize, например?
Нашел место, где контрол свой хедл прячет. И хранится он по смещению &H3C(60). Ну и заодно нашел и другие места где его можно найти. Таких мест оказалось 3 Мне интересно, а почему именно был указан диапазон 100-200 Байт?ark писал(а):2. Хэндл у контрола есть, и скорее всего, хранится для внутреннего пользования где-нибудь сразу за VTABLE. Попробуй посмотреть первые 100-200 байт за ObjPtr
Тут есть небольшая заминкаark писал(а):Ну, так есть ChildWindowFromPoint(Ex)
Private Declare Function ChildWindowFromPoint Lib "user32.dll" (ByVal hWndParent As Long, ByVal pt As POINTAPI) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Может GetClassName?Qwertiy писал(а):GetWindowClass
Вернуться в Windows-программирование
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5