Сначала ты получаешь дескриптор активного окна
а затем в цикле получаешь предыдущее по отношению к нему
NEXThWnd:= DllCall("GetWindow", "Ptr", hWnd, "Uint", 2)
То есть каждый раз один и тот же дескриптор. В моем примере hWnd меняется в цикле до тех пор, пока он не станет дескриптором окна, имеющего заголовок (Title).
Если так важно сохранить текущее активное окно, для этого можно использовать дополнительную переменную, но нужно учесть, что в данном примере при нажатии Numlock эта переменная будет каждый раз получать дескриптор активного окна.
#WinActivateForce
vk90::
NEXThWnd := hWnd := WinExist("A")
Loop {
NEXThWnd:= DllCall("GetWindow", "Ptr", NEXThWnd, "Uint", 2)
WinGetTitle, Title, ahk_id %NEXThWnd%
} Until Title
WinActivate, ahk_id %NEXThWnd%
Return
; Активировать окно, бывшее в фокусе при последнем нажатии NumLock
F12::
WinActivate, ahk_id %hWnd%
Return