Что нового

Как назначить одной кнопке 'свернуть-развернуть' окно другой программы

A

at

Гость
Версия AutoIt: 3.3.6.1

Описание: Здравствуйте. Покажите пожалуйста, как назначить кнопке Button2 свернуть и развернуть блокнот.

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### 
$Form1_1 = GUICreate("Programma", 246, 81, 192, 124)
$Button1 = GUICtrlCreateButton("<>", 136, 32, 75, 25)
$Button2 = GUICtrlCreateButton("Открыть блокнот", 16, 32, 99, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            GUISetState(@SW_HIDE)
        Case $Button2
            Run("notepad.exe")

    EndSwitch
WEnd
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ###
$Form1_1 = GUICreate("Programma", 246, 81, 192, 124)
$Button1 = GUICtrlCreateButton("<>", 136, 32, 75, 25)
$Button2 = GUICtrlCreateButton("Открыть блокнот", 16, 32, 99, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            GUISetState(@SW_HIDE)
        Case $Button2
            If Not WinExists('[CLASS:Notepad]') Then Run("notepad.exe") ;запускаем блокнот
			WinWait('[CLASS:Notepad]') ;ждем окно блокнота
			If WinGetState('[CLASS:Notepad]') = 7 Then ;если развернуто, то сворачиваем
				WinSetState('[CLASS:Notepad]', '', @SW_MINIMIZE)
			Else ;если-же нет, то разворачиваем
				WinSetState('[CLASS:Notepad]', '', @SW_RESTORE)
			EndIf
    EndSwitch
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
at
ИМХО, так корректнее:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $hWin, $iPid

$hGui = GUICreate('Test', 200, 80, -1, -1, -1, $WS_EX_TOPMOST)
$nButton = GUICtrlCreateButton('Открыть', 50, 25, 100, 30)
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			If $iPid Then ProcessClose($iPid)
			Exit
		Case $nButton
			If Not $hWin Or Not WinExists($hWin) Then
				$iPid = Run(@WindowsDir & '\notepad.exe')
				Sleep(100)
				If Not $iPid Then
					GUICtrlSetData($nButton, 'Error')
					ContinueLoop
				EndIf
				$aList = WinList('[CLASS:Notepad]')
				If Not $aList[0][0] Then
					GUICtrlSetData($nButton, 'Error')
					ContinueLoop
				EndIf
				For $i = 1 To $aList[0][0]
					If WinGetProcess($aList[$i][1]) = $iPid Then
						$hWin = $aList[$i][1]
						GUICtrlSetData($nButton, 'Свернуть')
						ExitLoop
					EndIf
				Next
				If Not $hWin Then
					GUICtrlSetData($nButton, 'Error')
				EndIf
			Else
				If BitAND(WinGetState($hWin), 16) Then
					WinSetState($hWin, '', @SW_RESTORE)
					GUICtrlSetData($nButton, 'Свернуть')
				Else
					WinSetState($hWin, '', @SW_MINIMIZE)
					GUICtrlSetData($nButton, 'Развернуть')
				EndIf
			EndIf
	EndSwitch
WEnd
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
madmasles, у меня ваш код не корректно работает. При нажатии на кнопку:
1) сворачивается активное окно.
2) запускает блокнот 2 раза.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
madmasles, теперь скрипт вообще ничего не сворачивает а только запускает 2 раза блокнот (за один клик по кнопке).
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Zaramot,
Проверил на XPx32, 7x32 и 7х64, все работает нормально.

запускает 2 раза блокнот (за один клик по кнопке).
Нечему там два раза блокнот запускать.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Нечему там два раза блокнот запускать
Извиняюсь я не так выразился...

При каждом нажатии на кнопку - каждый раз запускает блокнот. И не сворачивает и не разворачивает его :(

PS У меня Windows XP SP3 (x32)
PSS Возможно ваш скрипт только у меня не работает...
 

VladUs

Скриптер
Сообщения
621
Репутация
181
У меня пример madmasles работает нормально...
 
Автор
A

at

Гость
Все работает. У меня ХР SP3. Пытаюсь разобраться, как теперь это применить в своем скрипте. Дело в том, что мне нужно одновременно свернуть и развернуть пять разных окон. Буду вникать. Прошу подсказать назначение функции Not - не нашел описания.

Zaramot подскажи, где найти описание этого параметра = 7
Код:
If WinGetState('[CLASS:Notepad]') = 7
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Not это не функция, а оператор логического отрицания (см. Operators)
[url_ex=javascript:qq.OpenLink('http://autoit-script.ru/index.php/topic,6620.msg45908.html#msg45908')][/url_ex]
найти описание этого параметра = 7
Это не параметр, а возвращаемое значение.
В данном случае это побитовое сложение:
1 = окно имеется
2 = окно отображается
4 = окно доступно
1+2+4 =7
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
at [?]
Дело в том, что мне нужно одновременно свернуть и развернуть пять разных окон
Это и нужно было писать в первом посте. Класс окон разный? Окна уже существуют или Вы их из скрипта открываете?

PS
Я свой код поправил еще раз. :smile:
 
Автор
A

at

Гость
Думал сам смогу разобраться. Получилось очень криво.
Класс окон разный? Окна уже существуют или Вы их из скрипта открываете?
Все окна уже существуют.
[box title=Окно 1]>>>> Window <<<<
Title: G_1
Class: TFMain
Position: 749, 225
Size: 502, 88
Style: 0x16CF0000
ExStyle: 0x00010108
Handle: 0x001F02D8[/box][box title=Окно 2]>>>> Window <<<<
Title: S_2
Class: TFMain
Position: 749, 313
Size: 502, 88
Style: 0x16CF0000
ExStyle: 0x00010108
Handle: 0x001003B4[/box][box title=Окно_3]>>>> Window <<<<
Title: L_3
Class: TFMain
Position: 749, 401
Size: 502, 88
Style: 0x16CF0000
ExStyle: 0x00010108
Handle: 0x000C04E6[/box]
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
at,
Попробуйте так:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $fWin = True

$hGui = GUICreate('Test', 200, 80, -1, -1, -1, $WS_EX_TOPMOST)
$nButton = GUICtrlCreateButton('', 25, 25, 150, 30)
_WinState($fWin)
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nButton
			GUICtrlSetState($nButton, $GUI_DISABLE)
			_WinState($fWin)
			GUICtrlSetState($nButton, $GUI_ENABLE)
	EndSwitch
WEnd

Func _WinState(ByRef $f_Flag)
	Local $a_Title[4] = [3, 'G_1', 'S_2', 'L_3'], $s_Classname = '[Class:TFMain]', _
			$a_List, $iCount
	$a_List = WinList($s_Classname)
	If Not $a_List[0][0] Then Return
	For $i = 1 To $a_List[0][0]
		For $j = 1 To $a_Title[0]
			If $a_List[$i][0] == $a_Title[$j] Then
				If BitAND(WinGetState($a_List[$i][1]), 2) Then
					$iCount = 1
					If $f_Flag Then
						WinSetState($a_List[$i][1], '', @SW_RESTORE)
					Else
						WinSetState($a_List[$i][1], '', @SW_MINIMIZE)
					EndIf
				EndIf
			EndIf
		Next
	Next
	If $iCount Then
		If $f_Flag Then
			GUICtrlSetData($nButton, 'Свернуть')
		Else
			GUICtrlSetData($nButton, 'Развернуть')
		EndIf
		$f_Flag = Not $f_Flag
	Else
		GUICtrlSetData($nButton, 'Нет окон')
	EndIf
EndFunc   ;==>_WinState
 
Автор
A

at

Гость
Ничего не происходит. На кнопке надпись: 'Нет окон'.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
at [?]
Ничего не происходит. На кнопке надпись: 'Нет окон'.
У меня нет окон с классом TFMain, поэтому проверял с классом $s_Classname = '[Class:AutoIt v3 GUI]', запустив 3 окна скриптом:
Код:
#include <GUIConstantsEx.au3>

Dim $a_Title[4][2] = [[3],['G_1'],['S_2'],['L_3']]

For $i = 1 To $a_Title[0][0]
	$a_Title[$i][1] = GUICreate($a_Title[$i][0], 100, 100, 10 * ($i - 1) + 100 * ($i - 1))
	GUISetState()
Next

While 1
	$aMsg = GUIGetMsg(1)
	Switch $aMsg[0]
		Case $GUI_EVENT_CLOSE
			For $i = 1 To $a_Title[0][0]
				If $aMsg[1] = $a_Title[$i][1] Then
					GUIDelete($a_Title[$i][1])
					$a_Title[0][0] -= 1
					If Not $a_Title[0][0] Then Exit
				EndIf
			Next
	EndSwitch
WEnd
С ними у меня все работает. Почему не работает с TFMain, я не знаю.
 
Автор
A

at

Гость
madmasles с вашим скриптом у меня тоже работает, но мои окна не реагируют, пробовал менять макросы в вашем скрипте - не помогло. Вот как работает у меня:
Приходится создавать для каждого окна. Получилось слишком громоздко, и закрываются не разом, а по очереди.
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ###
$Form1_1 = GUICreate("Programma", 246, 81, 192, 124)
$Button1 = GUICtrlCreateButton("<>", 136, 32, 75, 25)
$Button2 = GUICtrlCreateButton("Открыть-Закрыть", 16, 32, 99, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button1
            GUISetState(@SW_HIDE)
        Case $Button2
			If WinGetState('G_1') = 7 Then ;если развернуто, то сворачиваем
                WinSetState('G_1', '', @SW_HIDE)
            Else ;если-же нет, то разворачиваем
                WinSetState('G_1', '', @SW_SHOW)
            EndIf
		EndSwitch
WEnd
 
Верх