1

Тема: VBScript: получение списка окон через API с DynamicWrapperX

Пример выводит список окон верхнего уровня в системе, их заголовки и hwnd, с помощью API EnumWindows. Демонстрация использования callback-функции в VBScript.
Потребуется библиотека DynamicWrapperX.

Set DX = CreateObject("DynamicWrapperX")

GPTR = 64 ' Тип памяти - фиксированная и обнулённая.

DX.Register "user32",   "EnumWindows",    "i=pl"
DX.Register "user32",   "GetWindowTextW", "i=hpl"     ' Вариант Unicode.
DX.Register "kernel32", "GlobalAlloc",    "i=uu", "r=p"
DX.Register "kernel32", "GlobalFree",     "i=p"

Set Ref = GetRef("CbkEnumWin")  ' Получение ссылки на функцию.

pCbkFunc = DX.RegisterCallback(Ref, "i=hl", "r=l")  ' Регистрация CbkEnumWin
                                                    ' как функции обратного вызова
                                                    ' и получение указателя.
n = 0 : m = 0 : WinList = ""

pBuffer = DX.GlobalAlloc(GPTR, 512) ' Буфер под заголовок окна.

DX.EnumWindows pCbkFunc, 0      ' Вызов EnumWindows с передачей ей указателя на
                                ' callback-функцию.

WScript.Echo "Всего окон: " & m & vbCrLf & "С заголовками: " & n & _
              vbCrLf & vbCrLf & WinList

DX.GlobalFree pBuffer ' Освобождение памяти.

' ................ Собственно callback-функция .......................

Function CbkEnumWin(hwnd, lparam)
  DX.GetWindowTextW hwnd, pBuffer, 256
  Title = DX.StrGet(pBuffer) ' Чтение строки из буфера.
  If Len(Title) > 0 Then  ' Если длина заголовка больше 0, заносим в список.
    WinList = WinList & hwnd & vbTab & Title & vbCrLf
    n = n+1
  End If
  m = m+1
  CbkEnumWin = 1          ' Если вернуть 0, вызовы прекратятся.
End Function

Автор примера - YMP.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.