Способы найти Handle окна

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
SeT
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 362
Зарегистрирован: 29.12.2004 (Ср) 13:11

Способы найти Handle окна

Сообщение SeT » 20.10.2005 (Чт) 16:52

Я знаю вот такой способ:
Private Declare Function GetWindowTextLength Lib "user32" _
Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long

Private Declare Function GetWindow Lib "user32" _
(ByVal hwnd As Long, ByVal wCmd As Long) As Long

Private Declare Function GetParent Lib "user32" _
(ByVal hwnd 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

'сам код

Public Function FindWindowByString(hWnd as Long, _
strCaption As String) As Long

Dim CurrWnd As Long
Dim Length As Long
Dim TaskName As String
Dim parent As Long
CurrWnd = GetWindow(hWnd, GW_HWNDFIRST)
While CurrWnd <> 0
parent = GetParent(CurrWnd)
Length = GetWindowTextLength(CurrWnd)
TaskName = Space$(Length + 1)
Length = GetWindowText(CurrWnd, TaskName, Length + 1)
TaskName = Left$(TaskName, Len(TaskName) - 1)
If Length > 0 Then
TaskName = LCase(TaskName)
strCaption = LCase(strCaption)
If InStr(1, TaskName, strCaption) > 0 Then
FindWindowByString = CurrWnd
Exit Function
End If
End If
CurrWnd = GetWindow(CurrWnd, GW_HWNDNEXT)
DoEvents
Wend
End Function
Но моя программа должна 10 раз с векунду искать окно. Из-за этого ЦП загружен на 99%. Нет ли способа попроще? :(
01000100
Причиняет боль 0010
Виртуальная любовь 00100
Индустрия снов 0010

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

Сообщение alibek » 20.10.2005 (Чт) 17:01

Есть API FindWindow(Ex).
Lasciate ogni speranza, voi ch'entrate.

SeT
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 362
Зарегистрирован: 29.12.2004 (Ср) 13:11

Сообщение SeT » 20.10.2005 (Чт) 17:08

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Wnd = FindWindow(vbNullString, "Названия окна")
Это? Почему-то он не хочет находить Handle окна "Служба сообщений" :shock: Может синтаксис неправильный?
01000100
Причиняет боль 0010
Виртуальная любовь 00100
Индустрия снов 0010

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Re: Способы найти Handle окна

Сообщение tyomitch » 20.10.2005 (Чт) 17:23

SeT писал(а):Но моя программа должна 10 раз с векунду искать окно. Из-за этого ЦП загружен на 99%. Нет ли способа попроще? :(

Ужас-то какой :shock:
Зачем тебе такое? Шеллхук не подойдёт?
Изображение

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 20.10.2005 (Чт) 17:48

Зачем так часто?.... :shock: Можно и по таймеру раз в секунду или в пол. Проц не грузится. :idea:
А я все практикую лечение травами...

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 20.10.2005 (Чт) 18:02

Ну писал же tyomitch, о шелхуке, зачем что-то новое изобретать.
Shellhook даст возможность отлавливать создание, уничтожение окна и т.д., без каких либо проверок.
tyomitch, а Shellhook будет работать при выключеном explorer'e?
الفيجوال بيسك الرابح

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.10.2005 (Чт) 18:55

Будет-будет.
Он как раз и предназначен для Эксплорера.
Ты же не думаешь, что Эксплорер десять раз в секунду перебирает все окна, чтобы обновить кнопки на таскбаре?
Изображение

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 20.10.2005 (Чт) 19:50

Ты же не думаешь, что Эксплорер десять раз в секунду перебирает все окна, чтобы обновить кнопки на таскбаре?

:)
Понятно, что эта штука используется для ехplorera я знаю, просто где-то читал что без включеного explorer'a она не будет работать.
الفيجوال بيسك الرابح

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 20.10.2005 (Чт) 21:41

просто где-то читал что без включеного explorer'a она не будет работать.

Ты наверное ошибся...
Где видано чтобы хуки не работали без эксплорера? Без винды-то понятно, но без него... :lol:
А я все практикую лечение травами...

Бяка
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 21.09.2005 (Ср) 21:28

Сообщение Бяка » 21.10.2005 (Пт) 0:08

такое ? :roll:

Код: Выделить всё
Private Declare Function GetParent Lib "user32" (ByVal hwnd 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 GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd 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 WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Private Type POINTAPI
    X As Long
    Y As Long
End Type


Public Function GetHwndFromCursor() As Long
  Dim p As POINTAPI, K$, j$
  K = GetCursorPos(p)
  GetHwndFromCursor = WindowFromPoint(p.X, p.Y)
End Function


Private Sub Timer1_Timer()
Dim HwndControl As Long
    Dim hWndParentA As Long
    Dim hWndParent As Long
    Dim CaptionWinLen As Long
    Dim CaptionWin As String
    Dim ClassWin As String
    Dim ClassWinLen As Long
   
    HwndControl = GetHwndFromCursor
   
    hWndParent = HwndControl
    Do
        hWndParentA = hWndParent
        hWndParent = GetParent(hWndParentA)
    Loop Until hWndParent = 0
     
    CaptionWinLen = (GetWindowTextLength(hWndParentA)) + 1
    CaptionWin = String$(CaptionWinLen, Chr(0))
    Call GetWindowText(hWndParentA, CaptionWin, CaptionWinLen)
   
    ClassWin = String$(32, Chr(0))
    ClassWinLen = GetClassName(hWndParentA, ClassWin, 32)
    ClassWin = Left(ClassWin, ClassWinLen)
   
    Text1 = "Hwnd окна - " &  hWndParentA
   Label2.Caption = "Кэпшн - " + CaptionWin
   Label3.Caption = "Класс - " + ClassWin

End Sub

SeT
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 362
Зарегистрирован: 29.12.2004 (Ср) 13:11

Сообщение SeT » 21.10.2005 (Пт) 16:56

Когда я выхожу в интернет. Раз 10 за минуту вылезает сообщение, что мой комп п*дой накрылся. Уже надоело. Охота, чтобы они убивались до того, как появятся на экране. Для этого и используется таймер с интервалом в 1/10 секунды. Может кто попроще предложит выход? :oops:
01000100
Причиняет боль 0010
Виртуальная любовь 00100
Индустрия снов 0010

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 21.10.2005 (Пт) 16:58

Ну я думаю, что связка файервол + антивирус будут получше таймера в данном случае :)
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.10.2005 (Пт) 17:05

Выключи службу net send, и будет тебе щастье...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.10.2005 (Пт) 17:14

GSerg писал(а):Выключи службу net send, и будет тебе щастье...

На всякий случай: это делается командой net stop messenger
Изображение

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 21.10.2005 (Пт) 17:42

tyomitch писал(а):На всякий случай: это делается командой net stop messenger
Ага, и больше никогда не выключай компьютер :)
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

SeT
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 362
Зарегистрирован: 29.12.2004 (Ср) 13:11

Сообщение SeT » 21.10.2005 (Пт) 17:44

Ну блин а если мне охота другие окна повырубать. ЧТо, тоже нужно всякие службы отключать чтоли? Прошу примерчик/исходник, а не то, как разобрать Windows :?
01000100
Причиняет боль 0010
Виртуальная любовь 00100
Индустрия снов 0010

GM
programador
programador
 
Сообщения: 1427
Зарегистрирован: 24.06.2003 (Вт) 15:56
Откуда: 194.67.52.100

Сообщение GM » 21.10.2005 (Пт) 19:53

Пример использования shellhook'a - http://www.Planet-Source-Code.com/vb/sc ... 3&lngWId=1
الفيجوال بيسك الرابح

SeT
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 362
Зарегистрирован: 29.12.2004 (Ср) 13:11

Сообщение SeT » 22.10.2005 (Сб) 11:40

Спасибо за ссылку :D
01000100
Причиняет боль 0010
Виртуальная любовь 00100
Индустрия снов 0010


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

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

Сейчас этот форум просматривают: SemrushBot и гости: 44

    TopList