Что нового

WinMinimizeAllUndo не работает?

jufas222

Знающий
Сообщения
93
Репутация
5
Версия: AutoIt v3

Описание: В скрипте нужно скрыть все активные окна, после завершения скрипта нужно их заного активировать.
Проверил
Код:
WinMinimizeAll()
Sleep(3000)
WinMinimizeAllUndo()

работает нормально.


Вот сам скрипт, в нём не работает, подскажите по какой причине?

Код:
HotKeySet("{ESC}","_Exit")


#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=c:\users\mama\desktop\form.kxf
$Form = GUICreate("Программа", 385, 530, 200, 127)
$Pic1 = GUICtrlCreatePic("C:\Users\Mama\Desktop\МОЯ\другое\33.jpg", 0, 0, 391, 558)
GUICtrlSetState(-1, $GUI_DISABLE)
$chtozaapustitb = GUICtrlCreateLabel("Что сделать?", 25, 8, 136, 17, $WS_GROUP)
GUICtrlSetFont(-1, 14, 800, 2, "Courier New")
$Button1 = GUICtrlCreateButton("Скачать лицензию Аваст", 8, 96, 201, 25, $WS_GROUP)
GUICtrlSetFont(-1, 10, 800,  "Gill Sans Ultra Bold")
$Button2 = GUICtrlCreateButton("Установить лицензию Аваст", 8, 140, 201, 25, $WS_GROUP)
GUICtrlSetFont(-1, 10, 800,  "Gill Sans Ultra Bold")
$Button3 = GUICtrlCreateButton("Выйти", 180, 500, 201, 25, $WS_GROUP)
GUICtrlSetFont(-1, 12, 800,  "Gill Sans Ultra Bold")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			WinMinimizeAll()
			Sleep(1000)
			WinSetState($Form, "", @SW_MINIMIZE);   после нажатия на кнопку скрыть приложение
            sleep(1000)                    ;СКАЧАТЬ ЛИЦЕНЗИЮ
			WinMinimizeAll()
			sleep(3000)
			Run("C:\Program Files (x86)\Mozilla Firefox\firefox.exe") ; open firefox
			Sleep(8000)
			WinActivate("Яндекс - Mozilla Firefox")
			sleep(500)
		    WinSetState("Яндекс - Mozilla Firefox","",@SW_MAXIMIZE)
			sleep(1000)
			MouseClick("left",163, 43,1,15); adress stroka
			Sleep(500)
			Send("http://www.avkeys.org/list_avast.htm") ; adress
			Sleep(200)
			Send("{ENTER}")
			Sleep(7000)
			MouseClick("left",663, 332,1,15);скачать офф версию на месяц
			Sleep(3000)
			MouseClick("left",700, 482,1,14) ; выбор продукта = сразу жмёт скчать
			Sleep(2000)
			MouseClick("left",677, 349,1,10) ;нажимает на ссылку скачивания
			Sleep(8000)
			MouseClick("left",442,384,1,10); download ass
			Sleep(2000)
			MouseClick("left",697,478,1,10) ;OK
			Sleep(3000)
			MouseClick("left",1336, 9,1,10); закрыть mazilla
			Sleep(2000)
			MsgBox(0,"Information","Готово")
			WinSetState("Программа","",@SW_RESTORE)
			WinMinimizeAllUndo()
			
		Case $Button2                                                                                ;ЛИЦЕНЗИЯ. ПОКАЗАТЬ СКРЫТЫЕ ПАПКИ

			WinSetState($Form, "", @SW_MINIMIZE);   после нажатия на кнопку скрыть приложение
			Sleep(1000)
			WinMinimizeAll()
			Sleep(1000)
			ShellExecute("C:\")
			Sleep(1000)
			WinSetState("WINDOWS (C:)","",@SW_MAXIMIZE)
			Sleep(1000)
			MouseClick("left",179, 70,1,10) ;service
			Sleep(500)
			Send("{DOWN}{Down}{down}{down}{ENTER}");parametri papok
			Sleep(2000)
			MouseClick("left",97, 124,1,10);vid
			Sleep(1000)
			MouseClickDrag( "left" ,370,301,367, 451 ,10 );
			Sleep(1000)
			MouseClick("left",79, 343,1,5); ckrivat zachihhenie papk
			Sleep(2000)
            Send("{left}{enter}")
			Sleep(500)
			MouseClick("left",222, 533,1,5) ;vichli iz svoistvo papki               СДЕЛАНО
			Sleep(2000)
			WinClose("WINDOWS (C:)")
			; C disk                      ОТКРЫТЬ ПАПКУ АВАСТ
			ShellExecute("C:\ProgramData\AVAST Software\Avast")
			Sleep(2000)
			WinActivate("Avast")
			Sleep(500)
			WinMove("Avast", "", @DesktopWidth/2+190,@DesktopHeight/2-389, 500, 700) ; окно в правую сторону            ОТКРЫЛИ
			Sleep(2000)
			   ;papka с лицензией                ОТКРЫТЬ ПАПКУ СО СКАЧЕНОЙ ЛИЦЕНЗИЕЙ

			ShellExecute("C:\Users\Mama\Downloads")
            Sleep(2000)
			WinActivate("Загрузки")
			Sleep(1000)
			WinMove("Загрузки", "", 0,0, 500, 700)
			sleep(2000)
			Send("l")
			$Coord = PixelSearch(180, 144,330,620,0xC9E0FC)
            if Not @error Then
	          MouseClickDrag("left",$Coord[0],$Coord[1],1272, 594,20)
			EndIf
		    MouseClick("left",651, 293,1,10) ;zamenili license
			Sleep(2000)
			WinClose("Avast")
			Sleep(1000)
			MouseClick("left",186, 76,1,5)
			Sleep(2000)
	        Send("{down}{down}{down}{down}{enter}")
			Sleep(2000)
			MouseClick("left",104, 132,1,5);vkladka vid
			Sleep(2000)
			MouseClickDrag( "left" ,370,301,367, 451 ,10 )
			Sleep(1000)
			MouseClick("left",87,353,1,10)
			sleep(2000)
			MouseClick("left",222,541,1,9);ok
			Sleep(3000)
			WinClose("Загрузки")
			Sleep(1000)
			MsgBox(0,"Information","Готово")
			WinSetState("Программа","",@SW_RESTORE)
			Sleep(2000)
			WinMinimizeAllUndo()
		Case $Button3
			Exit




	EndSwitch
WEnd



Func _Exit()
	Exit
EndFunc




P.S. Первый раз делаю что то связанное с GUI, если я не правельно пользуюсь Case прозьба не обсмеивать :-[ а указать как можно, для кнопки указать функцию...

P.S.S. в скрипте много коментариев, их я делал для себя, так как было мало времени, что бы сделать весь скрипт сразу, я делал в разное время :smile:
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Попробуй вместо:
Код:
WinMinimizeAllUndo()

использовать:
Код:
Send("#+m")
 
Автор
J

jufas222

Знающий
Сообщения
93
Репутация
5
Не какого действия не произошло.

Проверил так:
Код:
WinMinimizeAll()
Sleep(1000)
WinActivate("Компьютер")
Sleep(2000)
WinSetState("Компьютер", "", @SW_MINIMIZE)
WinMinimizeAllUndo()



Выходит после того как задам
Код:
@SW_MINIMIZE
или другую манипуляцию с окном, то действие
Код:
WinMinimizeAllUndo()
не работает, то есть после выполнения моего скрипта нельзя востановить ранее скрытые окна, или есть какой то выход?
 

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
jufas222
странно почему не работает. в моей системе работает твой скрипт как надо, по части сворачивания и разворачивания окон.
Windows 7 x64
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
jufas222
jufas222 сказал(а):
Выходит после того как задам
Код:
@SW_MINIMIZE
или другую манипуляцию с окном, то действие
Код:
WinMinimizeAllUndo()
не работает, то есть после выполнения моего скрипта нельзя востановить ранее скрытые окна, или есть какой то выход?
Это уже никак не связано с AutoIt, это поведение системы.
После сворачивания всех окон, запоминается их состояние, и если было сделано любое действие с окнами, это состояние сбрасывается.

Можно исправить примерно так:

Код:
$aMinimized_Wins = _WinMinimizeAll()

Sleep(1000)
WinActivate("Компьютер")
Sleep(2000)
WinSetState("Компьютер", "", @SW_MINIMIZE)

_WinMinimizeAllUndo($aMinimized_Wins)

Func _WinMinimizeAll()
	Local $hActive_Win = WinGetHandle('[ACTIVE]')
	
	Local $aWins = WinList()
	Local $aRet[$aWins[0][0]] = [1, $hActive_Win]
	Local $iState
	
	For $i = 1 To $aWins[0][0]
		$iState = WinGetState($aWins[$i][1])
		
		If $aWins[$i][0] <> '' And BitAND($iState, 2) And Not BitAND($iState, 16) Then
			$aRet[0] += 1
			$aRet[$aRet[0]] = $aWins[$i][1]
		EndIf
	Next
	
	WinMinimizeAll()
	
	ReDim $aRet[$aRet[0]+1]
	Return $aRet
EndFunc

Func _WinMinimizeAllUndo($aWins)
	If Not IsArray($aWins) Then Return SetError(1, 0, 0)
	
	Local $iOld_Opt = Opt('WinWaitDelay', 1)
	
	For $i = 2 To $aWins[0]
		WinSetState($aWins[$i], '', @SW_RESTORE)
	Next
	
	WinActivate($aWins[1])
	
	Opt('WinWaitDelay', $iOld_Opt)
EndFunc


Но это не восстановить порядок окон, т.е они будут восстановлены не в том же порядке как были свёрнуты/активны.
 
Автор
J

jufas222

Знающий
Сообщения
93
Репутация
5
CreatoR [?]
Можно исправить примерно так:

С помощью вашего кода востанавливаются абсолютно все свернутые окна, а не те которые были свернуты в коде.
 

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
jufas222
у тебя видимо какой то косяк в системе. я проверил твой скрипт при таких условиях:
были открыты несколько окон. часть из них я свернул, остальные были свернуты скриптом и им же восстановлены..окна которые были свернуты вручную не были восстановлены скриптом. ведь этого ты добиваешься?
 
Автор
J

jufas222

Знающий
Сообщения
93
Репутация
5
Александр [?]
у тебя видимо какой то косяк в системе
а не чего, то что я так жи проверил, да и ещё выше написал:smile: он работает и у меня корректно, но после того, как в скрипте произойдёт какая либо манипуляция с окном по средствам команды например
Код:
@SW_MINIMIZE

то действие
Код:
WinMinimizeAllUndo()

уже не будет работать.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
jufas222 [?]
С помощью вашего кода востанавливаются абсолютно все свернутые окна, а не те которые были свернуты в коде.
Восстанавливаются те окна, которые были свёрнуты при вызове _WinMinimizeAll, а это и есть все окна.
Как по другому?
 
Автор
J

jufas222

Знающий
Сообщения
93
Репутация
5
Ну например, если я с вашим кодом делаю, у меня и Skype, и ICQ открываются...Как я понял, по справке
Код:
WinMinimizeAll
скрывает все активные окна, а
Код:
WinMinimizeAllUndo
отменяет действие
Код:
WinMinimizeAll
то есть, активные окна скрываются, а потом востанавливаются, при этом не затрагиваются окна не попавшие под действие
Код:
WinMinimizeAll
, тоесть те которые уже изначально были свернуты....а ваш код восстанавливает обсолютно все свернутые окна.
 
Автор
J

jufas222

Знающий
Сообщения
93
Репутация
5
Я проверил так, открыл калькулятор и оставил его окошечко на рабочем столе, тоесть не свернул, открыл "Компьютер" и свернул его окошечко, далее запустил скрипт:
Код:
WinMinimizeAll()
Sleep(1000)
WinActivate("Компьютер")
Sleep(500)
WinSetState("Компьютер","",@SW_MAXIMIZE
$aMinimized_Wins = _WinMinimizeAll()

_WinMinimizeAllUndo($aMinimized_Wins)

Func _WinMinimizeAll()
    Local $hActive_Win = WinGetHandle('[ACTIVE]')

    Local $aWins = WinList()
    Local $aRet[$aWins[0][0]] = [1, $hActive_Win]
    Local $iState

    For $i = 1 To $aWins[0][0]
        $iState = WinGetState($aWins[$i][1])

        If $aWins[$i][0] <> '' And BitAND($iState, 2) And Not BitAND($iState, 16) Then
            $aRet[0] += 1
            $aRet[$aRet[0]] = $aWins[$i][1]
        EndIf
    Next

    WinMinimizeAll()

    ReDim $aRet[$aRet[0]+1]
    Return $aRet
EndFunc

Func _WinMinimizeAllUndo($aWins)
    If Not IsArray($aWins) Then Return SetError(1, 0, 0)

    Local $iOld_Opt = Opt('WinWaitDelay', 1)

    For $i = 2 To $aWins[0]
        WinSetState($aWins[$i], '', @SW_RESTORE)
    Next

    WinActivate($aWins[1])

    Opt('WinWaitDelay', $iOld_Opt)
EndFunc



У меня получилось, так, что окошечко с калькулятором скрылось, но заного не появилось, а "компьютер" развернулся.

Дальше я изменил не много, скрипт:
Код:
WinMinimizeAll()
Sleep(1000)
$aMinimized_Wins = _WinMinimizeAll()

_WinMinimizeAllUndo($aMinimized_Wins)

Func _WinMinimizeAll()
    Local $hActive_Win = WinGetHandle('[ACTIVE]')

    Local $aWins = WinList()
    Local $aRet[$aWins[0][0]] = [1, $hActive_Win]
    Local $iState

    For $i = 1 To $aWins[0][0]
        $iState = WinGetState($aWins[$i][1])

        If $aWins[$i][0] <> '' And BitAND($iState, 2) And Not BitAND($iState, 16) Then
            $aRet[0] += 1
            $aRet[$aRet[0]] = $aWins[$i][1]
        EndIf
    Next

    WinMinimizeAll()

    ReDim $aRet[$aRet[0]+1]
    Return $aRet
EndFunc

Func _WinMinimizeAllUndo($aWins)
    If Not IsArray($aWins) Then Return SetError(1, 0, 0)

    Local $iOld_Opt = Opt('WinWaitDelay', 1)

    For $i = 2 To $aWins[0]
        WinSetState($aWins[$i], '', @SW_RESTORE)
    Next

    WinActivate($aWins[1])

    Opt('WinWaitDelay', $iOld_Opt)
EndFunc




В этом случае, все активные окна свернулись и потом развернулись, те которые были активными, то есть, как и задумывалось, но получается что ваш код не работает, если в скрипте есть "манипуляции с окном", точно так жи, как и команда
Код:
WinMinimizeAllUndo
:(
 

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
jufas222 [?]
У меня получилось, так, что окошечко с калькулятором скрылось, но заного не появилось, а "компьютер" развернулся.
а у меня все получилось как надо. и калькулятор обратно развернулся и окно "компьютер" скрылось. я про код, который дал CreatoR
 

joiner

Модератор
Локальный модератор
Сообщения
3,570
Репутация
632
скопировал полностью скрипт CreatoR
окно "компьютер" свернул, окно "калькулятор" было не свернуто..при запуске скрипта произошло сворачивание калькулятора, разворачивание окна компьютер, сворачивание окна компьютер и восстановление окна калькулятор.
если в коде от CreatoR заменить строчку
Код:
WinSetState("Компьютер", "", @SW_MINIMIZE)

на
Код:
WinSetState("Компьютер","",@SW_MAXIMIZE)

то окно компьютер разворачивается на весь экран и по окончании работы скрипта окно калькулятора так же развернуто.
проверил на ХР и семерке
 
Автор
J

jufas222

Знающий
Сообщения
93
Репутация
5
Странно, сегодня скрипт CreatoR'a работает :shok:....Но, как скрипт CreatoR'a подставить в мой, если его просто "воткнуть", то выдаёт кучу ошибок о потери
Код:
EndSwitch
и
Код:
WEnd
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
jufas222 [?]
как скрипт CreatoR'a подставить в мой
Функции (то что начинается с Func) в самый конец скрипта, а их вызов (собственно сами названия функции), туда где это требуется.
 
Автор
J

jufas222

Знающий
Сообщения
93
Репутация
5
Большое вам спасибо :smile:, скажите мне пожалуйста, этот код альтернатива команд:
Код:
WinMinimizeAll
и
Код:
WinMinimizeAllUndo
, и их более надёжней использовать?
 
Верх