Основы офисного программирования и язык VBA


Еще один пример работы с функцией EnumWindows


Наш следующий пример является упрощенным вариантом предыдущего примера. Его целью является демонстрация возможности передать информацию в Callback процедуру EnumWindowsProc через параметр lParam. В нашем примере вместо трех коллекций будет использоваться только одна - коллекция описателей, именно она и будет передана стандартным способом через параметр lParam. Коллекция будет передана в качестве аргумента при вызове процедуры EnumWindows, а та, в свою очередь передаст его функции обратного вызова EnumWindowsProc. Приведем текст модуля, содержащего процедуры нашего примера:

Option Explicit

Public Declare Function EnumWindows Lib "user32" _ (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Public Declare Function EnumWindows1 Lib "user32" Alias "EnumWindows" _ (ByVal lpEnumFunc As Long, lParam As Any) As Long

Public HandleCol As New Collection Public HandleCol1 As New Collection

Public Function EnumWindowsProc(ByVal HandleW As Long, _ ByVal lParam As Long) As Long

HandleCol.Add HandleW EnumWindowsProc = 1 End Function

Public Function EnumWindowsProc1(ByVal HandleW As Long, _ lParam As Collection) As Long

lParam.Add HandleW EnumWindowsProc1 = 1 End Function

Public Sub GetHandles()

Dim item As Variant Dim Res As Long

Res = EnumWindows(AddressOf EnumWindowsProc, 0&)

Debug.Print "Number of windows - ", HandleCol.Count Debug.Print "Their handles: " Res = 0 For Each item In HandleCol Debug.Print item Res = Res + 1 If Res > 10 Then Exit For Next item

End Sub

Public Sub GetHandles1()

Dim item As Variant Dim Res As Long

Res = EnumWindows1(AddressOf EnumWindowsProc1, HandleCol1)

Debug.Print "Number of windows - ", HandleCol1.Count Debug.Print "Their handles: " Res = 0 For Each item In HandleCol1 Debug.Print item Res = Res + 1 If Res > 10 Then Exit For Next item

End Sub

Пример 6.10.

Дадим несколько комментариев:

  1. В этом примере параллельно показаны оба способа передачи информации. Имена функций, оканчивающиеся на 1, связаны с передачей информации через параметр lParam.
  2. В операторе Declare, описывающем функцию EnumWindows1, тип параметра lParam задан как Any, и в данном случае параметр передается по ссылке, а не по значению.
  3. При описании Callback функции EnumWindowsProc1 для этого параметра указан уже конкретный тип Collection.
  4. Аргумент HandleCol1 типа Collection передается при вызове EnumWindows в процедуре GetHandles1. Функция обратного вызова EnumWindowsProc1 заполнит эту коллекцию элементами.

Приведем результаты ее работы:

Number of windows -184 Their handles: 131826 131824 131854 131868 36504034 2359854 65636 262764 65690 65626 3539122




Начало  Назад  Вперед