Собственно, зациклить можно через message loop, как и положено.
Более продвинутый пример оконного безумства.
В главное окно вставлен контрол Edit, позволяющий вводить и редактировать текст.
Set WinAPI = CreateObject("DynamicWrapperX")
szClass = "VBScriptWindowClass"
szTitle = "VBScript Window"
IDI_APPLICATION = 32512
IDC_ARROW = 32512
COLOR_WINDOW = 5
CS_VREDRAW = 1
CS_HREDRAW = 2
ClsStyle = CS_VREDRAW or CS_HREDRAW
WS_OVERLAPPEDWINDOW = &HCF0000
WS_VISIBLE = &H10000000
WndStyle = WS_OVERLAPPEDWINDOW or WS_VISIBLE
WS_CHILD = &H40000000
WS_VSCROLL = &H00200000
ES_MULTILINE = &H0004
ES_AUTOVSCROLL = &H0040
EditStyle = WS_CHILD or WS_VSCROLL or ES_MULTILINE or ES_AUTOVSCROLL or WS_VISIBLE
WM_CLOSE = &H10 ' Сообщение, что юзер закрыл окно.
WM_SIZE = 5
WM_SETFOCUS = 7
WM_KEYDOWN = &H100
VK_CONTROL = &H11
VK_A = &H41
vk_prev = 0
EM_SETSEL = &HB1
wc = WinAPI.Space(24, "") ' WNDCLASSEX, структура класса окна.
rc = WinAPI.Space(8, "") ' RECT
With WinAPI
.Register "kernel32", "GetModuleHandleW", "i=p", "r=h"
.Register "user32", "LoadIconW", "i=hl", "r=h"
.Register "user32", "LoadCursorW", "i=hl", "r=h"
.Register "user32", "RegisterClassExW", "i=p", "r=t"
.Register "user32", "CreateWindowExW", "i=uwwullllhhhp", "r=h"
.Register "user32", "DefWindowProcW", "i=hull", "r=l"
.Register "user32", "GetClientRect", "i=hp", "r=l"
.Register "user32", "MoveWindow", "i=hlllll"
.Register "user32", "SetFocus", "i=h"
.Register "user32", "GetMessageW", "i=phll", "r=l"
.Register "user32", "TranslateMessage", "i=p", "r=l"
.Register "user32", "DispatchMessageW", "i=p", "r=l"
.Register "user32", "PostQuitMessage", "i=l"
.Register "user32", "SendMessage", "i=hull", "r=l"
' Регистрируем оконную процедуру.
pWndProc = .RegisterCallback(GetRef("WndProc"), "i=hull", "r=l")
' Заполняем структуру класса.
hModule = .GetModuleHandleW(0)
.NumPut 48, wc, 0
.NumPut ClsStyle, wc, 4
.NumPut pWndProc, wc, 8
.NumPut hModule, wc, 20
.NumPut .LoadIconW(0, IDI_APPLICATION), wc, 24
.NumPut .LoadCursorW(0, IDC_ARROW), wc, 28
.NumPut COLOR_WINDOW + 1, wc, 32
.NumPut .StrPtr(szClass), wc, 40
' Регистрируем класс.
If .RegisterClassExW(wc) = 0 Then
MsgBox "Ошибка при регистрации класса."
WScript.Quit
End If
' Создаём главное окно.
hwndEdit = 0 ' Для проверки в обработчике WM_SIZE.
hwndMain = .CreateWindowExW(0, szClass, szTitle, WndStyle, 300, 200, 400, 300, 0, 0, hModule, 0)
If hwndMain = 0 Then
MsgBox "Ошибка при создании окна."
WScript.Quit
End If
.GetClientRect hwndMain, rc
w = .NumGet(rc, 8)
h = .NumGet(rc, 12)
' Создаём дочернее окно Edit.
hwndEdit = .CreateWindowExW(0, "EDIT", "", EditStyle, 0, 0, w, h, hwndMain, 0, hModule, 0)
If hwndEdit = 0 Then
MsgBox "Ошибка при создании контрола Edit."
WScript.Quit
End If
.SetFocus hwndEdit
' Цикл очереди сообщений.
msg = .Space(14, "") ' MSG
Do
ret = .GetMessageW(msg, 0, 0, 0)
If ret > 0 Then
' Чтобы работало сочетание Ctrl-A.
If .NumGet(msg, 4, "t") = WM_KEYDOWN Then
If .NumGet(msg, 8) = VK_A and vk_prev = VK_CONTROL Then
.SendMessage hwndEdit, EM_SETSEL, 0, -1
End If
vk_prev = .NumGet(msg, 8)
End If
.TranslateMessage(msg)
.DispatchMessageW(msg)
End If
Loop While ret > 0
End With
' Оконная процедура, получающая сообщения окна.
Function WndProc(hWnd, uMsg, wParam, lParam)
With WinAPI
If uMsg = WM_SETFOCUS and hwndEdit <> 0 Then
.SetFocus hwndEdit
WndProc = 0
End If
If uMsg = WM_SIZE and hwndEdit <> 0 Then
.GetClientRect hWnd, rc
w = .NumGet(rc, 8)
h = .NumGet(rc, 12)
.MoveWindow hwndEdit, 0, 0, w, h, 1
WndProc = 0
End If
If uMsg = WM_CLOSE Then
.PostQuitMessage 0
WndProc = 0
End If
WndProc = .DefWindowProcW(hWnd, uMsg, wParam, lParam)
End With
End Function