#include <MsgBoxConstants.au3>
Local $hWnd = LastActiveWindow()
MsgBox($MB_SYSTEMMODAL, "", "Title: " & WinGetTitle($hWnd) & @CRLF & "Handle: " & $hWnd)
Func LastActiveWindow()
Local $aList = WinList()
For $i = 1 To $aList[0][0]
If $aList[$i][0] <> "" And BitAND(WinGetState($aList[$i][1]), 2) And $aList[$i][0] <> "Пуск" Then Return $aList[$i][1]
Next
EndFunc
#include <MsgBoxConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
Local $hWnd = LastActiveWindow()
MsgBox($MB_SYSTEMMODAL, "", "Title: " & WinGetTitle($hWnd) & @CRLF & "Handle: " & $hWnd)
Func LastActiveWindow()
Local $aList = WinList()
For $i = 1 To $aList[0][0]
If _
$aList[$i][0] <> "" And _
BitAND(WinGetState($aList[$i][1]), 2) And _
Not BitAND(_WinAPI_GetWindowLong($aList[$i][1], $GWL_EXSTYLE), $WS_EX_TOPMOST) _
Then
; ---
Return $aList[$i][1]
EndIf
Next
EndFunc
У меня, как и следовало ожидать, порядок идентичен положению в Z-Order.Но ведь <Alt+Tab> прекрасно помнит порядок последних окон, несмотря на флаг $WS_EX_TOPMOST
#include <MsgBoxConstants.au3>
#include <GUIConstantsEx.au3>
Run("notepad.exe")
Run("Au3Info_x64.exe")
$hWndN = WinWait("[CLASS:Notepad]", "", 10)
WinActivate($hWndN)
Local $hWnd = LastActiveWindow()
ConsoleWrite(WinGetTitle($hWnd) & @CRLF & "Handle: " & $hWnd)
Local $hGUI = GUICreate("Example", 400, 100)
GUISetState()
While GUIGetMsg() <> $GUI_EVENT_CLOSE
WEnd
GUIDelete($hGUI)
Func LastActiveWindow()
Local $aList = WinList()
For $i = 1 To $aList[0][0]
If $aList[$i][0] <> "" And BitAND(WinGetState($aList[$i][1]), 2) And $aList[$i][0] <> "Пуск" Then Return $aList[$i][1]
Next
EndFunc
#include <WinAPI.au3>
#include <Constants.au3>
$hPrevious = _GetPreviousActiveWindow()
If Not $hPrevious Then Exit ConsoleWrite('Error' & @LF)
ConsoleWrite('Title: ' & _WinAPI_GetWindowText($hPrevious) & @LF)
ConsoleWrite('Class: ' & _WinAPI_GetClassName($hPrevious) & @LF)
Func _GetPreviousActiveWindow($h_Active = 0)
If Not $h_Active Then $h_Active = WinGetHandle('[ACTIVE]')
If Not $h_Active Then Return 0
Do
$h_Active = _WinAPI_GetWindow($h_Active, $GW_HWNDNEXT)
If Not $h_Active Then Return 0
Until _WinAPI_IsWindowVisible($h_Active)
Return $h_Active
EndFunc ;==>_GetPreviousActiveWindow
Оно их попросту игнорирует. Переключение происходит только путем отправки на дно Z-Order активного окна.Кстати, альтернативное переключение по Alt+ESC вообще не затрагивает topmost-окна ни на Win7 ни на Win8.
Интересно, если в скрипте не создавать окно с $WS_EX_TOPMOST, то функция отрабатывает правильно.Тот же принцип Z-Order, пробуйте на примере TopMost.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
GUICreate('Test', 300, 300, -1, -1, -1, $WS_EX_TOPMOST)
GUISetState()
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
#include <WinAPI.au3>
#include <Constants.au3>
GUICreate('Test1')
GUISetState()
Sleep(1000)
$hPrevious = _GetPreviousActiveWindow()
If Not $hPrevious Then Exit ConsoleWrite('Error' & @LF)
ConsoleWrite('Title: ' & _WinAPI_GetWindowText($hPrevious) & @LF)
ConsoleWrite('Class: ' & _WinAPI_GetClassName($hPrevious) & @LF)
Func _GetPreviousActiveWindow($h_Active = 0)
If Not $h_Active Then $h_Active = WinGetHandle('[ACTIVE]')
If Not $h_Active Then Return 0
Do
$h_Active = _WinAPI_GetWindow($h_Active, $GW_HWNDNEXT)
If Not $h_Active Then Return 0
Until _WinAPI_IsWindowVisible($h_Active)
Return $h_Active
EndFunc ;==>_GetPreviousActiveWindow
Title: Пуск
Class: Button
Потому что в z-буфере сначала идут topmost-окна, затем обычные окна. Если ваше окно обычное, то оно будет помещено первым после topmost-окон и GW_HWNDNEXT вернёт следующее "обычное" окно. Если ваше окно имеет стиль WS_EX_TOPMOST, то оно будет помещено в самое начало z-буфера и для него следующим будет topmost-окно, т.е. кнопка "Пуск". http://www.transl-gunsmoker.ru/2012/04/windows.html#zorderПочему так, не понимаю
А почему тогда в первом примере возвращает SciTE?Потому что в z-буфере сначала идут topmost-окна, затем обычные окна.
Я не совсем понял, чей первый пример вы имеете в виду.в первом примере возвращает SciTE
... And $aList[$i][0] <> "Пуск" Then ...