Про handl'ы и процессы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Про handl'ы и процессы

Сообщение claymen » 20.12.2006 (Ср) 17:15

Вот скачал из сети небольшой код, да не могу понять, как его юзать.
Он говорит handle родных/дочерних окошек формы "Me".
А как бы мне заставить его говорить handl'ы дочерних окошек других программ?
Код: Выделить всё
Option Explicit

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 GetWindowTextLength Lib "user32" _
Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long

Private Declare Function GetNextWindow Lib "user32" _
Alias "GetWindow" (ByVal hwnd As Long, ByVal wFlag As Long) _
As Long

Public Function GetCaption(lhWnd As Long) As String
Dim sA As String, lLen As Long
   lLen& = GetWindowTextLength(lhWnd&)
      sA$ = String(lLen&, 0&)
   Call GetWindowText(lhWnd&, sA$, lLen& + 1)
   GetCaption$ = sA$
End Function

Public Function DLHFindWin(frm As Form, WinTitle As String, _
CaseSensitive As Boolean) As Long

Dim lhWnd As Long, sA As String
   lhWnd& = frm.hwnd
Do
   DoEvents
      If lhWnd& = 0 Then Exit Do
         If CaseSensitive = False Then
             sA$ = LCase$(GetCaption(lhWnd&))
             WinTitle$ = LCase$(WinTitle$)
         Else
             sA$ = GetCaption(lhWnd&)
         End If

       If InStr(sA$, WinTitle$) Then
          DLHFindWin& = lhWnd&
          Exit Do
       Else
         DLHFindWin& = 0
       End If
       lhWnd& = GetNextWindow(lhWnd&, 2)
Loop
End Function

Private Sub Form_Load()
    MsgBox DLHFindWin(Me, "Project1", False)
End Sub
и начинали мы все чайниками, но потом...

HandKot
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 283
Зарегистрирован: 28.06.2006 (Ср) 13:34
Откуда: Sergiev Posad

Сообщение HandKot » 20.12.2006 (Ср) 17:28

я так думаю здесь задавать хэндл нужного окна
Код: Выделить всё
lhWnd& = frm.hwnd
I Have Nine Lives You Have One Only
THINK!

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 20.12.2006 (Ср) 18:21

HandKot
Ну это теперь выглядит так:
Код: Выделить всё
Option Explicit
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 GetWindowTextLength Lib "user32" _
Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Private Declare Function GetNextWindow Lib "user32" _
Alias "GetWindow" (ByVal hwnd As Long, ByVal wFlag As Long) _
As Long

Public Function GetCaption(lhWnd As Long) As String
Dim sA As String, lLen As Long
   lLen& = GetWindowTextLength(lhWnd&)
      sA$ = String(lLen&, 0&)
   Call GetWindowText(lhWnd&, sA$, lLen& + 1)
   GetCaption$ = sA$
End Function

Public Function DLHFindWin(xHwnd As Long, WinTitle As String, _
CaseSensitive As Boolean) As Long
Dim lhWnd As Long, sA As String
   lhWnd& = xHwnd
Do
   DoEvents
      If lhWnd& = 0 Then Exit Do
         If CaseSensitive = False Then
             sA$ = LCase$(GetCaption(lhWnd&))
             WinTitle$ = LCase$(WinTitle$)
         Else
             sA$ = GetCaption(lhWnd&)
         End If
       If InStr(sA$, WinTitle$) Then
          DLHFindWin& = lhWnd&
          Exit Do
       Else
         DLHFindWin& = 0
       End If
       lhWnd& = GetNextWindow(lhWnd&, 2)
Loop
End Function

Private Sub Timer1_Timer()
Dim hwnd As Long
    hwnd = FindWindowByCaption("Программа X")
    If hwnd Then
        Label.Caption = hwnd & " / " & DLHFindWin(hwnd, "Настройки", False)
    End If
End Sub

И все равно этот код не дает мне handle окна "Настройки" программы "Программа X".
Блин!
Да как же это сделать?
и начинали мы все чайниками, но потом...

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 20.12.2006 (Ср) 18:24

А можно-ли перебором (ну например: от 1 до 10000) проверять handl'ы на принадлежность к дочернему окну "Настройки" программы "Программа Х"?
и начинали мы все чайниками, но потом...

_ae_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 165
Зарегистрирован: 08.10.2006 (Вс) 14:37

Сообщение _ae_ » 20.12.2006 (Ср) 19:44

claymen
Гениальная идея. А почему до 10000 а не до &HFFFFFFFF ?

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 21.12.2006 (Чт) 4:29

claymen, поиск окон через FindWindow. Поищи примеры на форуме.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 21.12.2006 (Чт) 5:49

_ae_ писал(а):claymen
Гениальная идея. А почему до 10000 а не до &HFFFFFFFF ?

Ну чтож...Может подскажешь, как перебирать?
и начинали мы все чайниками, но потом...

_ae_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 165
Зарегистрирован: 08.10.2006 (Вс) 14:37

Сообщение _ae_ » 21.12.2006 (Чт) 11:58

claymen
Постом выше.


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 120

    TopList