Что нового

[Окна, Диалоги] Как определить какое окно поверх всех остальных

IgRo

Знающий
Сообщения
65
Репутация
5
Как определить какое окно поверх всех остальных (скрипт не учитывается т.к. у него WinSetOnTop)? При этом окно может быть не активным (т.к. сам скрип периодически будет активен).
Необходимо для скрипта типа ''Швейцарский нож'' в котором находятся утилиты для разных програм и в зависимости от программы с которой работает пользователь в скрипте отображаются нужные GIU
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
проверяется не атрибут окна "поверх всех", а именно активно ли окно.
Код:
Sleep (3000)
$all_windows = WinList(); собираем в массив все окна  
For $i = 1 to $all_windows[0][0]; перебираем все окна
If WinActive ($all_windows[$i][1]) Then ; если активно, уведомляем
MsgBox (0, "", WinGetTitle($all_windows[$i][1])) ; с заголовком активного окна
Exit
EndIf 
Next
 
Автор
I

IgRo

Знающий
Сообщения
65
Репутация
5
Нужна ещё обработка когда окно не активно но находится поверх всех
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
$aWinList = WinList()

For $i = 1 To $aWinList[0][0]
	If $aWinList[$i][0] <> "" And _WinVisible($aWinList[$i][1]) And _WinOnTop($aWinList[$i][1]) Then
		MsgBox(64, "", $aWinList[$i][0])
	EndIf
Next

Func _WinVisible($sTitle, $sText="")
	Return BitAND(WinGetState($sTitle, $sText), 2)
EndFunc

Func _WinOnTop($sTitle, $sText="")
	If Not WinExists($sTitle, $sText) Then Return SetError(1, 0, 0)
	
	Local $hWnd = $sTitle
	If Not IsHWnd($hWnd) Then $hWnd = WinGetHandle($sTitle, $sText)
	
	Local $aRet = DllCall('User32.dll', 'long', 'GetWindowLong', 'hwnd', $hWnd, 'int', -20)
	If IsArray($aRet) Then Return BitAND(0x00000008, $aRet[0])
	
	Return SetError(1, 0, 0)
EndFunc
 
Автор
I

IgRo

Знающий
Сообщения
65
Репутация
5
Спасибо за помощь
однако _WinOnTop() и _WinVisible() у меня не работают например
Код:
While 1 = 1
	Sleep(100)
	Select
		Case _WinOnTop("Безымянный - Блокнот")
			MsgBox(0, "On Top", "Блокнот")
	EndSelect
WEnd

при OnTop Блокнот ничего не выдает, а
Код:
While 1 = 1
	Sleep(100)
	Select
		Case  _WinVisible("Безымянный - Блокнот" )
		MsgBox(0, "Visible", "Блокнот")
	EndSelect
WEnd

срабатывает даже когда Блокнот не видим
---------------------------------------------
Если располагаем окна каскадом как определить последовательность окон? В принципе последовательность сохраняется когда одно из окон сверху и при его закрытии какое окно будет видно?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
IgRo [?]
при OnTop Блокнот ничего не выдает
А окно Блокнота имеет аттрибут "поверх всех окон"?

срабатывает даже когда Блокнот не видим
А как определяется что окно блокнота не видно? :smile:

P.S
Примеры выше ничего не показывают, при «Select...Case» нужно указывать полное условие.


Добавлено:
Сообщение автоматически объединено:

Код:
While 1
    Sleep(100)
    Select
        Case _WinVisible("Безымянный - Блокнот") = 1
            MsgBox(0, "Visible", "Блокнот")
    EndSelect
WEnd
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А зачем вообще все эти сложности? WinList() возвращает список окон, начиная с самого верхнего.
 
Верх