Страница: 1 |
Страница: 1 |
Вопрос: Поиск hwnd контрола?
Добавлено: 19.02.05 18:59
Автор вопроса: SyavX
Как можно найти hwnd контрола, когда, допустим, знаем заголовок формы, на которой находится э.у., заголовок и имя класса самого контрола. Заранее спасибо.
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #1
Добавлено: 19.02.05 20:04
Ну да скажем по имени класса ты его не найдешь на форме, а вот по тексту на нем, вполне реально...
Номер ответа: 2
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #2
Добавлено: 19.02.05 22:34
Имя класса контрола поможет отсеять ненужные контролы и искать только среди принадлежащих данному классу.
EnumChildWindows перебирает все окна, дочерние к форме. Тебе будут перечисляться hWnd контролов, а ты будешь для каждого hWnd узнавать его класс и текст на контроле и сравнивать со своими данными. Когда совпадёт - значит ты нашёл искомый контрол, и имеешь в руках его hWnd. Чтобы найти hWnd самой формы - FindWindow
Номер ответа: 3
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #3
Добавлено: 19.02.05 22:54
(я про то что контролов с одним и тем же именем класса может быть несколько, и не факт что ты найдешь именно то что надо... Т.е. нужен доп. данные, к примеру текст
Номер ответа: 4
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #4
Добавлено: 19.02.05 23:52
Ну а я что говорю Вроде не забыл указать, что (процитирую себя) узнавать его класс и текст на контроле
SyavX, может быть несколько контролов с одним и тем же текстом, но принадлежащих к разным классам, например текстбокс со строкой в нём "FFFF" и кнопка "FFFF". Поэтому проверять надо и класс и текст.
Номер ответа: 5
Автор ответа:
SyavX
Вопросов: 25
Ответов: 149
Профиль | | #5
Добавлено: 20.02.05 23:10
Спасибо cresta и sne за советы. Попробовал написать - работает. Моей радости небыло предела. За основу взял чей-то код с использованием EnumWindows и т.д. (Поскольку о Win32 API узнал только из
примеров с VB'шных сайтов, то самому написать такое было бы не реально). В общем получилось что-то типа:
Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal
lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long,
ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long,
ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Dim sTextMask As String
Dim sClassMask As String
Dim hFind, hParent As Long
Function EnumWinProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim c, t As Integer
Dim sText As String
Dim sClass As String
sClass = Space$(128)
c = GetClassName(hwnd, sClass, 128)
If c > 0 Then
sClass = Left$(sClass, c)
If sClass Like sClassMask Then
sText = Space$(128)
t = GetWindowText(hwnd, sText, 128)
If t > 0 Then
sText = Left$(sText, t)
If sText Like sTextMask Then
hFind = hwnd
EnumWinProc = 0 '###
Exit Function
End If
End If
End If
End If
EnumWinProc = 1 '###
End Function
Public Function FindWindowHandle(hWndParent As Long, sWindowText As String, sClassName) As Long
sTextMask = sWindowText
sClassMask = sClassName
hParent = hWndParent
EnumChildWindows hParent, AddressOf EnumWinProc, 0&
FindWindowHandle = hFind
End Function
Может чё не так - исправьте, но у меня работало
Номер ответа: 6
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #6
Добавлено: 20.02.05 23:41
Dim hFind, hParent As Long
У тебя только hParent объявлена как Long, hFind же объявлен как вариант. Работать не перестанет, но лучше наверное сделать Long
Dim hFind As Long, hParent As Long
То же самое и с Dim c, t As Integer:
Dim c As Integer, t As Integer