Что нового

[Окна, Диалоги] Как свернуть окно в трей посредством AutoIt?

killbond

Осваивающий
Сообщения
96
Репутация
32
Есть некая программа, которую я добавил в автозагрузку, и хотелось бы, чтобы при загрузке она сворачивалась в трей, как это сделать?
Код:
WinGetState

Для окна, свернутого в трей возвращает 21, для развернутого - 39. Но для
Код:
WinSetState

Эти флаги, к сожалению, не работают :(
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 124
Репутация
2 322
WinSetState("title", "", @SW_HIDE) - спрячет окно, для отображения значка в трее можно использовать нечто подобное:

Код:
#NoTrayIcon
#include <Constants.au3>

Opt("TrayMenuMode", 1)

Global $sCurrent_Title = ""

HotKeySet("^+h", "_MinimizeWindow_Proc")

While 1
	Switch TrayGetMsg()
		Case $TRAY_EVENT_PRIMARYUP
			_MinimizeWindow_Proc()
	EndSwitch
WEnd

Func _MinimizeWindow_Proc()
	If $sCurrent_Title <> "" Then
		Opt("TrayIconHide", 1)
		WinSetState($sCurrent_Title, "", @SW_SHOW)
		WinActivate($sCurrent_Title)
		$sCurrent_Title = ""
		Return
	EndIf
	
	$sCurrent_Title = WinGetTitle("")
	If $sCurrent_Title = "" Then Return
	
	Opt("TrayIconHide", 0)
	WinSetState($sCurrent_Title, "", @SW_HIDE)
	TraySetToolTip($sCurrent_Title)
EndFunc
 
Автор
K

killbond

Осваивающий
Сообщения
96
Репутация
32
Как я понял, если окно спрятано, то в трее отображается иконка скрипта, а не самого окна, а если окно развернуто, то иконка скрипта скрыта... хитро, однако :smile:, спасибо.

Вот как я решил этот вопрос - подменил сворачивание окна программы сворачиванием в трей (в моей ситуации это работает как надо, потому что окно запускается свернутым), т.е. теперь, если нажать на кнопку "Свернуть", окно сворачивается в трей, и это работает до тех пор, пока программа не закрыта, вообщем, код скажет все сам за себя:
Код:
#include <Constants.au3>
#NoTrayIcon

Opt("TrayMenuMode", 1)
$sTitle = ""

While WinExists ($sTitle)
	Select
	case WinGetState ($sTitle) = 23
		WinSetState ($sTitle, "", @SW_HIDE)
		Opt("TrayIconHide", 0)
		TraySetToolTip(WinGetTitle(WinGetHandle($sTitle)))
	case TrayGetMsg() = $TRAY_EVENT_PRIMARYUP
		WinSetState ($sTitle, "", @SW_SHOW)
		WinActivate($sTitle)
		Opt("TrayIconHide", 1)
	EndSelect
	sleep (10)
Wend

Но в основе все равно идея CreatoR'a
 

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
408
Вот ещё один вариант:

Код:
#include <GUIConstantsEx.au3>
#include <APIConstants.au3>
#include <WinAPIEx.au3>

Opt('TrayMenuMode', 3)

$hForm = GUICreate('', 400, 300)
GUISetState(@SW_SHOW, $hForm)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
	Switch TrayGetMsg()
		Case $TRAY_EVENT_PRIMARYDOWN
			If BitAnd(WinGetState($hForm), 2) Then
                _WinAPI_SetWindowLong($hForm, $GWL_HWNDPARENT, WinGetHandle(AutoItWinGetTitle()))
                ;_WinAPI_SetWindowLong($hForm, $GWL_HWNDPARENT, _WinAPI_GetDesktopWindow())
				GUISetState(@SW_HIDE, $hForm)
		    Else
				_WinAPI_SetWindowLong($hForm, $GWL_HWNDPARENT, 0)
				GUISetState(@SW_SHOW, $hForm)
			EndIf
	EndSwitch
Wend


Кликаем левой кнопкой мыши по иконке в трее, это всё можно сделать так же и на кнопку окна Close или Minimize
 

SharkyEXE

Чайник
Сообщения
84
Репутация
0
Всем здравствуйте.

Пожалуйста, помогите, научите меня, как использовать это http://autoit-script.ru/index.php?topic=1194.msg8615#msg8615

Так не работает
Код:
#NoTrayIcon
#include <Constants.au3>

# Запуск программы "RMS Агент"
Run ("G:\Program Files\RMSAgentPortable\agent.exe", "", "" )

# Ожидаем появления окна программы "RMS Агент" с заголовком " RMS Агент "
$hWnd = WinWait ( "RMS Агент", "" )

# Активируем окно программы "RMS Агент" с заголовком " RMS Агент "
WinActivate ( $hWnd, "" )

WinWaitActive ( $hWnd, "" )

WinSetOnTop ( $hWnd, "", 1 )

WinSetState("RMS Агент", "", @SW_HIDE)

Opt("TrayMenuMode", 1)

Global $sCurrent_Title = ""

HotKeySet("^+h", "_MinimizeWindow_Proc")

While 1
    Switch TrayGetMsg()
        Case $TRAY_EVENT_PRIMARYUP
            _MinimizeWindow_Proc()
    EndSwitch
WEnd

Func _MinimizeWindow_Proc()
    If $sCurrent_Title <> "" Then
        Opt("TrayIconHide", 1)
        WinSetState($sCurrent_Title, "", @SW_SHOW)
        WinActivate($sCurrent_Title)
        $sCurrent_Title = ""
        Return
    EndIf
   
    $sCurrent_Title = WinGetTitle("")
    If $sCurrent_Title = "" Then Return
   
    Opt("TrayIconHide", 0)
    WinSetState($sCurrent_Title, "", @SW_HIDE)
    TraySetToolTip($sCurrent_Title)
EndFunc
Точнее работает, окно программы после запуска вышенаписанного скрипта исчезает, однако на панели задач нету значка, в трее есть знакчок, по нему кликаешь что левой кнопкой мышки, что правой кнопкой мышки - контекстное меню не появляется, окно программы не появляется
 

Вложения

Верх