Что нового

[Окна, Диалоги] Реакция окон на положение мыши

Malmsteen

Новичок
Сообщения
3
Репутация
0
Версия AutoIt: 3.2.12.1

Описание: Прошу помощи у более опытных пользователей AutoIt. Система Windows_XP_Professional_SP3. Идея такая: открыто более одного "свёрнутого в окно" окна; при переводе указателя мыши за пределы активного окна (№1) на неактивное (№2) должно происходить следующее: окно № 1 становится полупрозрачным, при возврате мышки на окно № 1 всё возвращается в исходный вид, т.е. окна № 1 и № 2 - непрозрачные, окно № 1 - активно.

Примечания: Прикладываю свой скрипт на рассмотрение, что не так делаю?

Код:
#include <Constants.au3>

; Управление выполнением скрипта: пауза - стоп
Global $Paused
HotKeySet("{PAUSE}", "TogglePause")
HotKeySet("{ESC}", "Terminate")

While 1
    Sleep(100)
WEnd


Func TogglePause()
    $Paused = NOT $Paused
    While $Paused
        sleep(100)
        ToolTip('Скрипт приостановлен',0,0)
    WEnd
    ToolTip("")
EndFunc

Func Terminate()
    Exit 0
EndFunc

; Далее идёт скрипт
$hWin = WinGetHandle("[ACTIVE]") ;получить хэндл всех активных окон
$var = WinList() ;все видимые окна
$Pos = MouseGetPos()
$state = WinGetState("[ACTIVE]") ;активное окно


While 1
	 If $state = 1 Then Exit
Sleep(10)		 
	 If $state > 1 Then
		 MouseGetPos()
		 WinGetState("")
		 While MouseGetPos() = WinGetState("")
			 Sleep(10)
		 WEnd
	 If Not MouseGetPos() = WinGetState("") Then WinSetTrans("", "", 170)
		 EndIf
WEnd

#cs ----------------------------------------------------------------------------

 Второй вариант сценария:
 While 1
 If Not $hWin Then Sleep(10);если нет активных окон - бездействовать
		 If $var = [1] Then Sleep(10) ;если окно одно - бездействовать
			 If $var > [1] Then
				 If BitAND(WinGetState($hWin), 8) Then $Pos = MouseGetPos()
					 If Not $Pos = $state then WinSetTrans($state, "", 170) ;если мышь вне активного окна, сделать его полупрозрачным
						 EndIf
WEnd

#ce ----------------------------------------------------------------------------
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Во - первых сразу бросается в глаза лишний цикл. У Вас получается постоянная пауза и скрипт не продолжает работу:

Код:
While 1
    Sleep(100)
WEnd


Во - вторых попробуйте так :
Код:
Global $Paused, $hForm
HotKeySet("{PAUSE}", "TogglePause")
HotKeySet("{ESC}", "Terminate")

Func TogglePause()
    $Paused = NOT $Paused
    While $Paused
        sleep(100)
        ToolTip('Скрипт приостановлен',0,0)
    WEnd
    ToolTip("")
EndFunc

Func Terminate()
    Exit 0
EndFunc


While 1
 
$var = WinList()

For $i = 1 to $var[0][0]
 
  If $var[$i][0] <> "" AND IsVisible($var[$i][1]) Then
   $hForm = WinGetHandle($var[$i][0])
    _CurForms ($hForm)
  EndIf
Next

WEnd
     
Func IsVisible($handle)
  If BitAnd( WinGetState($handle), 8 ) Then 
    Return 1
  Else
    Return 0
  EndIf

EndFunc

Func _CurForms ($hForm)

$CurPos = MouseGetPos()
$FormPos =  WinGetPos( $hForm) 

If $CurPos[0] > $FormPos[0] And $CurPos[0] < ($FormPos[0] + $FormPos[2]) And $CurPos[1]>$FormPos[1] And $CurPos[1] < $FormPos[1] + $FormPos[3] Then
	WinSetTrans ( $hForm, "", 250 )
Else
	WinSetTrans ( $hForm, "", 170 )
EndIf
	
EndFunc
 
Автор
M

Malmsteen

Новичок
Сообщения
3
Репутация
0
VladUs

1. Насчёт лишнего цикла - спасибо, проглядел я его :shok:.
2. Ваш вариант скрипта попробовал - класс. Есть, правда, "побочные эффекты" :scratch:: а) обои рабочего стола слетают и не устанавливаются до рестарта компа; б) конфликт с отображением StackDocklet в панели RocketDock (нет значков, пустое полупрозрачное поле).
Поэтому, извиняюсь, но ещё вопрос: в тот же (Ваш) скрипт можно внести окна-исключения, на которые скрипт не будет распространяться?
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Malmsteen [?]
можно внести окна-исключения, на которые скрипт не будет распространяться?

Код:
AutoItSetOption("WinTitleMatchMode", 4)

Global $Paused, $hForm
HotKeySet("{PAUSE}", "TogglePause")
HotKeySet("{ESC}", "Terminate")

Func TogglePause()
    $Paused = NOT $Paused
    While $Paused
        sleep(100)
        ToolTip('Скрипт приостановлен',0,0)
    WEnd
    ToolTip("")
EndFunc

Func Terminate()
    Exit 0
EndFunc


Run("Notepad.Exe")
While 1
 
$var = WinList()

For $i = 1 to $var[0][0]
 
$hForm = WinGetHandle($var[$i][0])

  If $var[$i][0] <> "Безымянный - Блокнот"  AND IsVisible($var[$i][1]) Then
    _CurForms ($hForm)
  EndIf
Next

WEnd
     
Func IsVisible($handle)
  If BitAnd( WinGetState($handle), 8 ) Then 
    Return 1
  Else
    Return 0
  EndIf

EndFunc

Func _CurForms ($hForm)

$CurPos = MouseGetPos()
$FormPos =  WinGetPos( $hForm) 

If $CurPos[0] > $FormPos[0] And $CurPos[0] < ($FormPos[0] + $FormPos[2]) And $CurPos[1]>$FormPos[1] And $CurPos[1] < $FormPos[1] + $FormPos[3] Then
	WinSetTrans ( $hForm, "", 250 )
Else
	WinSetTrans ( $hForm, "", 150 )
EndIf
	
EndFunc


Таперь под действие скрипта не должен попадать (для примера) Блокнот, точнее окно с заголовком "Безымянный - Блокнот" и панель рабочего стола...
 
Автор
M

Malmsteen

Новичок
Сообщения
3
Репутация
0
VladUs сказал(а):
Таперь под действие скрипта не должен попадать (для примера) Блокнот, точнее окно с заголовком "Безымянный - Блокнот" и панель рабочего стола...

Жаль, но панель всё же (вместе с обоиной) попадает под действие скрипта.Попробую в кач-ве исключения вписать и SysListView32 в скрипт. Но в целом вопрос решён, мелочи сам доведу.
Спасибо, VladUs. Считаем вопрос решённым. :ok:
 
Верх