Что нового

Реакция неактивного окна на загораживание

SergVrn

Новичок
Сообщения
87
Репутация
2
Добрый день.
Подскажите, кто знает - решение.

Есть окно программы, к примеру документ блокнота с названием титла : "Документ-1"
Это окно находится поверх всех окон и неактивно.

Как реализовать скриптом - реакцию этого неактивного окна - на загораживание его любым другим окном ?
(Чтобы окно блокнота с названием "Документ-1" тут же расположилось опять поверх всех окон, но при этом не становилось бы активным.)
 
Автор
S

SergVrn

Новичок
Сообщения
87
Репутация
2
InnI
Не совсем так.
Окно не должно иметь такой аттрибут постоянно.
Оно только должно получить этот атрибут кратковременно, в тот момент, когда это окно - загораживают.
То есть оно должно среагировать именно на ЗАГОРАЖИВАНИЕ. (загораживание имеется ввиду - полное, а не частичное)

WinSetOnTop() - это не спасение. Это окно можно запросто загородить другим окном с тем же аттрибутом (где тоже установлен параметр "поверх всех окон").
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
SergVrn [?]
Оно только должно получить этот атрибут кратковременно
Это окно можно запросто загородить другим окном с тем же аттрибутом
Но если окну временно установить атрибут "поверх всех", то при снятии этого атрибута оно будет сразу же перекрыто другим окном с атрибутом "поверх всех".
Другими словами, окном с атрибутом "поверх всех" можно будет всегда перекрыть ваше окно независимо от того, есть у вашего окна этот атрибут или нет.
 
Автор
S

SergVrn

Новичок
Сообщения
87
Репутация
2
InnI
Нет, в этом случае я вообще не буду использовать окон у которых есть свойство "поверх всех".

Речь идет о реакции окна - на загораживание его другим окном.
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
Код:
Run('notepad.exe')
Local $k, $hWnd = WinWaitActive('[CLASS:Notepad]')

While WinExists($hWnd)
	If Not WinActive($hWnd) Then
		$aPos = WinGetPos($hWnd)
		If @error Then ExitLoop
		$aPos_2 = WinGetPos('')
		If @error Then ContinueLoop
		If ($aPos_2[0] + $aPos_2[2]) >= ($aPos[0] + $aPos[2]) And _
				($aPos_2[1] + $aPos_2[3]) >= ($aPos[1] + $aPos[3]) And _
				$aPos_2[0] <= $aPos[0] And $aPos_2[1] <= $aPos[1] Then
			WinSetOnTop($hWnd, '', 1)
			Sleep(100)
			WinSetOnTop($hWnd, '', 0)
		EndIf
	EndIf
	Sleep(200)
WEnd
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
xXx
По вашему алгоритму, если активное окно превышает окно блокнота по ширине И высоте, то, для выполнения условия, достаточно накрыть правым нижним углом активного окна левый верхний угол блокнота. Но это легко поправить.
Другой вопрос в том, что окно блокнота можно накрыть несколькими окнами. Вот тут алгоритм будет посложнее.
 

xXx

╚{■_■}╗
Меценат
Сообщения
248
Репутация
95
InnI сказал(а):
это легко поправить.
Поправил.

InnI сказал(а):
можно накрыть несколькими окнами.
При этом активным будет всегда одно. При необходимости можно уменьшить Sleep().

Косяк проявляется если какое-нибудь контекстное меню попадает на подконтрольное окно.
OffTopic:
А вообще - изврат это полный.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
xXx [?]
При этом активным будет всегда одно.
Верно. Но я имел в виду несколько окон рядом. Когда каждое закрывает только часть блокнота, а вместе они накрывают окно блокнота целиком.

OffTopic:
А вообще - изврат это полный.
Согласен :beer:
 
Верх