Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Поиск hwnd контрола? Добавлено: 19.02.05 18:59  

Автор вопроса:  SyavX
Как можно найти hwnd контрола, когда, допустим, знаем заголовок формы, на которой находится э.у., заголовок и имя класса самого контрола. Заранее спасибо.

Ответить

  Ответы Всего ответов: 6  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #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'шных сайтов, то самому написать такое было бы не реально). В общем получилось что-то типа:

Option Explicit
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

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам