Тема: 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.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.