Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСНОВЫ ОФИСНОГО ПРОГРАММИРОВАНИЯ И ЯЗЫК VBA - 2....doc
Скачиваний:
79
Добавлен:
17.12.2018
Размер:
1.62 Mб
Скачать

Еще один пример работы с функцией 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. (html, txt)

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

  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

Функции Win32 api для работы с таймером

Кроме функций перечисления, требующих в процессе своей работы вызов Callback функций, другим известным примером является функция SetTimer, создающая таймер. Во многих приложениях возникает необходимость синхронизировать его работу в соответствии с регулярно поступающими сообщениями от таймера. Общая схема такова: таймер посылает сообщения приложению с заданным интервалом, в ответ приложение выполняет определенную работу, вызывая ту или иную функцию (Callback функцию). Класс таких диспетчерских приложений, регулярно обрабатывающих вновь поступившие заявки, весьма велик. При работе в приложении Access для этих целей введен специальный элемент управления - Timer. В приложениях Word или Excel такого элемента нет, но всегда можно воспользоваться соответствующими функциями Win32 API, чтобы создать один или несколько собственных таймеров и организовать работу приложения, реагирующего на их сообщения. Заметьте, несмотря на то, что физический таймер один, логических таймеров, посылающих приложению свои сообщения, может быть несколько.