1 (изменено: DaVinchi, 2016-07-29 22:15:25)

Тема: AHK: CheckBox in Tray, команда Run и переменная

Очень мучает два вопроса:
1. Вожможно ли в меню по нажатию на значек трея впихнуть чекбокс?
2. Можно ли использовать переменную вместо параметра Hide|Min|Max в время выполнения команды Run?

run, Start.exe %vid1% %vid2%, D:\MyProgram\, %Какаято_Переменная%, pi_d

При тестах с переменной ничего не вышло .

2

Re: AHK: CheckBox in Tray, команда Run и переменная

DaVinchi, вам пора правила форума перечитать.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: yalanne, 2016-07-29 22:08:54)

Re: AHK: CheckBox in Tray, команда Run и переменная

-

4

Re: AHK: CheckBox in Tray, команда Run и переменная

yalanne, нежелательно отвечать в неправильно оформленной теме.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: yalanne, 2016-07-29 22:13:16)

Re: AHK: CheckBox in Tray, команда Run и переменная

DaVinchi добавь текст

run,   ...   , pi_d

в тег [ code ] и точек добавь.

6

Re: AHK: CheckBox in Tray, команда Run и переменная

Ещё есть правило: одна тема — один вопрос (если вопросы не связанные).

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: CheckBox in Tray, команда Run и переменная

teadrinker Так вопрос то как раз и связан. Я хочу добавить в меню трея CheckBox, который и будет отвечать за переменную. Т.е. если ChekBox отмечен, то переменная будет Hide и программа будет запущена скрытно. А если галочка не стоит, то параметр запуска будет пустым и программа просто запустится.

8 (изменено: yalanne, 2016-07-29 22:24:36)

Re: AHK: CheckBox in Tray, команда Run и переменная

DaVinchi пишет:

1. Вожможно ли в меню по нажатию на значек трея впихнуть чекбокс?

Вот Два варианта:

+ Обычный
#Persistent
Menu,Tray,NoStandard
Menu, Tray, add, Item1
Menu, Tray, add, Item2
Menu, Tray, add, Item3
Menu, Tray, add,
Menu, Tray, add,Выход
MenuListChecked := {}
Return

Выход:
ExitApp
Return

Item1:
Item2:
Item3:
Menu, % A_ThisMenu, ToggleCheck, %A_ThisMenuItem%
MenuListChecked[A_ThisMenuItem] := Not MenuListChecked[A_ThisMenuItem]

Msgbox % "Меню:`t" A_ThisMenu
             . "`nПункт:`t" A_ThisMenuItem
			 . "`nПозиция:`t" A_ThisMenuItemPos
             . "`nГалочка:`t" MenuListChecked[A_ThisMenuItem]
+ Эльфийский:)

AHK Версия должна быть последней 1.1.24.00.

#Persistent
Menu,Tray,NoStandard
Menu, Tray, add, Item1
Menu, Tray, add, Item2
Menu, Tray, add, Item3
Menu, Tray, add,
Menu, Tray, add,Выход

Return

Выход:
ExitApp
Return

Item1:
Item2:
Item3:
Menu, % A_ThisMenu, ToggleCheck, %A_ThisMenuItem%
Msgbox % "Меню:`t" A_ThisMenu
             . "`nПункт:`t" A_ThisMenuItem
			 . "`nПозиция:`t" A_ThisMenuItemPos
             . "`nГалочка:`t" GetMenuItemChecked(A_ThisMenu,A_ThisMenuItemPos)
Return


GetMenuItemChecked(HandleOrName,ItemPos)
{
	Local hMenu,MENUITEMINFO,SizeStruct
	hMenu := (HandleOrName + 0 = "") ? MenuGetHandle(A_ThisMenu) : HandleOrName ; Если переменная в виде имени, то извлекаем id, иначе просто id. 
	VarSetCapacity(MENUITEMINFO, SizeStruct:= A_PtrSize=8 ? 80 : 48) ; win 64x или 32x
	NumPut(SizeStruct, MENUITEMINFO, 0) ;Первый параметр структуры, В нем задается размер который равен тому что было определено выше.
	NumPut(1, MENUITEMINFO, 4) ;fMask = MIIM_STATE. Второй параметр структуры, В нем указывается то что маска стуктуры будет fState.
	DllCall("GetMenuItemInfo", "UInt", hMenu, "UInt", (ItemPos-1), "UInt", 1, "UInt", &MENUITEMINFO) ; получаем информацию о элементе меню.
	Return NumGet(MENUITEMINFO,12) & 0x8 ? true : false ;  Получаем значение fState. Если в нем есть MFS_CHECKED[0x8], то на пункте есть галочка.
}

Отличаются они тем что, если программно(другой программой. например с помощью api SetMenuItemInfo) изменить значение галочки, то в первом варианте скрипт этого и не заметит. Скрипт будет выдавать ложное значение.
Во втором варианте скрипт смотрит значение галочки, а не просто хранит в переменных. Так же может увидить значение галочки в чужом стандартном меню(может даже не от ahk).
Но думаю первый вариант в большем случае больше подходит.

DaVinchi пишет:

2. Можно ли использовать переменную вместо параметра Hide|Min|Max в время выполнения команды Run?

+ Вариант 1
statusWin := "Max"

Run, Notepad.exe, C:\Мои документы, %statusWin%
+ Вариант 2
statusWin := ["Max","Min","Hide"]

Run, Notepad.exe, C:\Мои документы, % statusWin[2]

*2 - порядковый номер в массиве. 2 = Min

9

Re: AHK: CheckBox in Tray, команда Run и переменная

yalanne Спасибо огромное. Расписал так расписал . Эльфийский вариант решения мне не подходит по 2м причинам: а) Слишком сложно для моей соображалки; б) Мне нужно что бы мой код выполнялся у меня на компе на 1й программе, все остальное мне не интересно.
И вторая часть вопроса. ChekBox будет записываться в INI, что бы при следующем запуске не нужно было делать лишних телодвижений. Т.е. после чтения config.ini мне же не обязательно присваивать переменную типа

statusWin := "Max"

Достаточно будет прописать так:


IniRead, minmin, config.ini, winsize, minmin

Run, Notepad.exe, C:\Мои документы, %minmin%, pi_d

я все правильно понял?

10 (изменено: yalanne, 2016-07-30 11:07:52)

Re: AHK: CheckBox in Tray, команда Run и переменная


DetectHiddenWindows,On
#Persistent
IniRead, It_1, config.ini, MenuTray,It_1,% " "

Menu,Tray,NoStandard
Menu, Tray, add, Run
Menu, Tray, add, Item1
IfEqual,It_1,1,Menu,Tray,Check,Item1

Menu, Tray, add,
Menu, Tray, add,Выход
Return

Выход:
WinClose,ahk_pid %pi_d%
ExitApp

Item1:
Menu, % A_ThisMenu, ToggleCheck, %A_ThisMenuItem%
It_1 := not It_1
IniWrite,% It_1,config.ini,MenuTray,It_1
Return


Run:
Run, Notepad.exe, C:\Мои документы, % It_1 ? "Hide" : "", pi_d

Вместо not It_1 в принципе можно использовать GetMenuItemChecked(A_ThisMenu,A_ThisMenuItemPos).

11

Re: AHK: CheckBox in Tray, команда Run и переменная

yalanne А можно мне подробнее объяснить вот этот момент:

Run, Notepad.exe, C:\Мои документы, % It_1 ? "Hide" : "", pi_d

Интересует меня именно значение переменной? Ну знак переменной, дальше имя переменной, дальше значение, откуда оно понимает что использовать Hide, либо заполнить пустым? Просто для меня конструкция такого вида новая

% It_1 ? "Hide" : ""

То что это 2 значения, одно из которых может стать переменная, я понял. Просто сам принцип не пойму.
Можно по этому поводу ссылочку на методический материал?

И еще один вопрос: Перед командой Run не обязательно снова ставить IniRead?

12

Re: AHK: CheckBox in Tray, команда Run и переменная

Знак вопроса значит Если переменная содержит 1,-1,СЛОВО - то это истина(1). Знак двоеточия значит что должно быть если там ноль или вообще пустая переменная - ложь.
В такой связке нельзя убирать : и то что после него идет, должно быть хотя бы так : "".

var := -1
;var := 0
;var := "test"
;var := ""
msgbox % var ? "Не ноль" : "Ноль"

Так же можно поменять местами, для этого надо добавить not или !

var := -1
;var := 0
;var := "test"
;var := ""
msgbox % !var ? "ноль" : "не ноль"
DaVinchi пишет:

Можно по этому поводу ссылочку на методический материал?

https://www.autohotkey.com/docs/Variables.htm#ternary

DaVinchi пишет:

Перед командой Run не обязательно снова ставить IniRead?

Если вручную менять значение в ini файле при вкл скрипте, то можно.
А так необязательно.

13

Re: AHK: CheckBox in Tray, команда Run и переменная

yalanne Обнаружил такую проблему. Если я закрываю скрипт с включенным ChekBox, что при попытке повторного запуска выдает ошибку:


Error: Nonexist menu item.
Specifically: Item1
	Line#
	001:DetectHiddenWindows,On
	003:IniRead, It_1, config.ini, MenuTray,It_1," "
	005:Menu, Tray, NoStandard
	006:Menu, Tray, Add, &START, 1st
	007:Menu, Tray, add
	009:Menu, Tray, add, &Спрятать,Item1
	010:IfEqual,It_1=1,
	010:Menu,Tray,Check,Item1
	012:Menu, Tray, add
	013:Menu, Tray, Add, &ShowBrowser, ShowMM
	014:Menu, Tray, Add, &InTrayBrowser, HMM
	015:Menu, Tray, Add, &TimeLeft, Timer
	016:Menu, Tray, Add, &Exit, Exit
	017:Return
	020:Process, Close, firefox.exe
The current thread will exit.

Извиняюсь что ошибку предоставляю в таком виде, но тут очень не удобно работать со скриншотами.
Если же я ручками поправлю INI и поставлю значение 0, то запускается скрипт без проблем. Не пойму как исправить.

yalanne пишет:

В такой связке нельзя убирать : и то что после него идет, должно быть хотя бы так : "".

Значит кавычки это "Пробел"\ пустота. Т.е. ноль. Честно говоря я уже все голову разбил об этот вопрос, а оно оказывается все гораздо проще.

14 (изменено: yalanne, 2016-07-30 13:00:43)

Re: AHK: CheckBox in Tray, команда Run и переменная

DaVinchi пишет:

009:Menu, Tray, add, &Спрятать,Item1
010:IfEqual,It_1=1,
010:Menu,Tray,Check, ̶I̶t̶e̶m̶1̶

3й параметр это имя пункта.
4й параметр это уже имя метки.
Это лишнее.
Что бы поставить\снять галочку надо указывать имя пункта(или порядковый номер и знак &) а не имя метки.

#Persistent
Menu, Tray, add, &Спрятать,Item1
IfEqual,It_1,1,Menu,Tray,Check,&Спрятать ; или 1&
return

Item1:

15 (изменено: DaVinchi, 2016-07-30 14:44:38)

Re: AHK: CheckBox in Tray, команда Run и переменная

yalanne Я вас понял. Все прекрасно работает. Разве что с порядковым номером не вышло, но это и не принципиально.
upd. Появилась новая проблема. Как уже выше писал, у меня не стандартное меню трея, в котором есть пункты показать или спрятать браузер (это для периодического контроля). Код этот выглядит примерно так (приведу в пример куски кода):


Menu, Tray, NoStandard
Menu, Tray, Add, &START, 1st
Menu, Tray, add,

Menu, Tray, add, &Спрятать,Item1
IfEqual,It_1,1,Menu,Tray,Check,&Спрятать

Menu, Tray, add,
Menu, Tray, Add, &Показать браузер, ShowMM
Menu, Tray, Add, &Спрятать в трей, HMM
Menu, Tray, Add, &Таймер, Timer
Menu, Tray, Add, &Exit, Exit
Return

1st:
Run, Notepad.exe, C:\Мои документы, % It_1 ? "Hide" : "", pi_d
return

ShowMM: 
IniRead, pi_d, config.ini, P_I_D, pi_d
WinShow, ahk_pid %pi_d%
return

Item1:
Menu, % A_ThisMenu, ToggleCheck, %A_ThisMenuItem%
It_1 := not It_1
IniWrite,% It_1,config.ini,MenuTray,It_1
Return

HMM:
IniRead, pi_d, config.ini, P_I_D, pi_d
WinHide, ahk_pid %pi_d%
return

Так вот вопрос в чем: Почему иногда скрипт отказывается выполнять блоки НММ и ShowMM? А точнее он показывает программу почти всегда, но после выполнения ShowMM, программу уже не спрятать командой WinHide из блокаНММ. Что ему не нравится?

16 (изменено: yalanne, 2016-07-30 16:28:25)

Re: AHK: CheckBox in Tray, команда Run и переменная

А зачем постоянно при нажатии тех пунктов читать ини файл?

IniRead, pi_d, config.ini, P_I_D, pi_d

И этот pi_d идет от run'a, но нет записи(IniWrite) же в этот самый ини файл. При прочтени скрипт получает ERROR при IniRead, pi_d...
Так как скорой всего там нет этого.

17 (изменено: DaVinchi, 2016-07-30 17:19:52)

Re: AHK: CheckBox in Tray, команда Run и переменная

yalanne
Оно там есть, просто я забыл этот кусок дописать. Я же говорю, тут просто куски кода. В общем лучше я представлю полный код и от него будем отталкиваться.


DetectHiddenWindows,On
#Persistent
IniRead, It_1, config.ini, MenuTray,It_1,% " "

Menu, Tray, NoStandard
Menu, Tray, Add, &START, 1st
Menu, Tray, add,

Menu, Tray, add, &Спрятать,Item1
IfEqual,It_1,1,Menu,Tray,Check,&Спрятать

Menu, Tray, add,
Menu, Tray, Add, &Показать браузер, ShowMM
Menu, Tray, Add, &Спрятать в трей, HMM
Menu, Tray, Add, &Таймер, Timer
Menu, Tray, Add, &Exit, Exit
Return

1st:
Process, Close, firefox.exe
IniRead, pi_d, config.ini, P_I_D, pi_d
Sleep, 500
IfWinNotExist, ahk_pid %pi_d%
	{
		IniRead, minmin, config.ini, freez, minmin
		IniRead, maxmin, config.ini, freez, maxmin
		IniRead, last_line, config.ini, Line, last_line ;Нужен ли тут IniRead? или хватит и в шапке кода?
		IniRead, It_1, config.ini, MenuTray,It_1,% " "
		Random, freez, %minmin%, %maxmin%
		freeztime:= freez*1000*60 ;задержка в минутах*нам кл-во мс в секунды*на кол-во секунд в минуте
		Random, rand, 2, 4
		gosub, %rand%vid
	}
return

2vid:
Random, rr1, 1, %last_line%
FileReadLine, vid1, 123.txt, %rr1%
Random, rr2, 1, %last_line%
FileReadLine, vid2, 123.txt, %rr2%
run, Start Tor Browser.lnk %vid1% %vid2%, D:\Tor Browser\, % It_1 ? "Hide" : "", pi_d
IniWrite, %pi_d%, config.ini, P_I_D, pi_d
WinWait, ahk_pid %pi_d%
TrayTip, Запускаю видео, %rand% Окна; ИД окна %pi_d%; Время слипа %freez%, 1, info,
gosub, Finish
return

3vid:
Random, rr1, 1, %last_line%
FileReadLine, vid1, 123.txt, %rr1%
Random, rr2, 1, %last_line%
FileReadLine, vid2, 123.txt, %rr2%
Random, rr3, 1, %last_line%
FileReadLine, vid3, 123.txt, %rr3%
run, Start Tor Browser.lnk %vid1% %vid2% %vid3%, D:\Tor Browser\, % It_1 ? "Hide" : "", pi_d
IniWrite, %pi_d%, config.ini, P_I_D, pi_d
WinWait, ahk_pid %pi_d%
TrayTip, Запускаю видео, %rand% Окна; ИД окна %pi_d%; Время слипа %freez%, 1, info, 
gosub, Finish
return

4vid:
Random, rr1, 1, %last_line%
FileReadLine, vid1, 123.txt, %rr1%
Random, rr2, 1, %last_line%
FileReadLine, vid2, 123.txt, %rr2%
Random, rr3, 1, %last_line%
FileReadLine, vid3, 123.txt, %rr3%
Random, rr4, 1, %last_line%
FileReadLine, vid4, 123.txt, %rr4%
run, Start Tor Browser.lnk %vid1% %vid2% %vid3% %vid4%, D:\Tor Browser\, % It_1 ? "Hide" : "", pi_d
IniWrite, %pi_d%, config.ini, P_I_D, pi_d
WinWait, ahk_pid %pi_d%
TrayTip, Запускаю видео, %rand% Окна; ИД окна %pi_d%; Время слипа %freez%, 1, info, 
gosub, Finish
return

Finish:
settimer time, 1000    ; запускаем таймер для отображения время паузы
time:=a_tickcount
Sleep, %freeztime%
IniRead, pi_d, config.ini, P_I_D, pi_d
Sleep, 500
;WinShow, ahk_pid %pi_d%
;Sleep, 500
WinKill,  ahk_pid %pi_d%
Sleep, 5000
gosub, 1st
return

time:
    time2 := (a_tickcount - time) // 60000 ;;минуты
	return

Timer:
	last2:= freez - time2
	MsgBox, , Время, "Было всего:" %freez% "Осталось:" %last2% МИНУТ
return

Item1:
Menu, % A_ThisMenu, ToggleCheck, %A_ThisMenuItem%
It_1 := not It_1
IniWrite,% It_1,config.ini,MenuTray,It_1
Return

ShowMM: 
IniRead, pi_d, config.ini, P_I_D, pi_d
WinShow, ahk_pid %pi_d%
return


HMM:
IniRead, pi_d, config.ini, P_I_D, pi_d
WinHide, ahk_pid %pi_d%
return


Exit:
	WinShow, ahk_pid %pi_d%
    ExitApp

Данный скрипт выполнен топорно, но я отталкивался от времени и своих заний .

18 (изменено: yalanne, 2016-08-01 21:25:14)

Re: AHK: CheckBox in Tray, команда Run и переменная

Команда run создает новый поток при каждом запуске, а в pi_d хранится старый. Да и в коде что то все напутано)
Можешь описать подробно что хочешь от своего скрипта, я напишу его с нуля по своему с комментариями.
То что скрывать браузер Tor По кнопке в трей это понятно, а Вот Зачем там таймер с случайной меткой??

Там еще вроде в ини файле параметры запуска Tor'a прописаны же?

19

Re: AHK: CheckBox in Tray, команда Run и переменная

yalanne В общем идея сего скрипта такова:
Запускать тор браузер с открытием нескольких (рандом от 2 до 4) вкладок со случайными ссылками, которые хранятся в 123.txt. Из скрипта понятно, что я пытаюсь реализовать некое подобие интерфейса (пока что трейменю) с некоторыми настройками, как те же чек боксы. Что бы можно было включить Запускать браузер видимым или не видимым.
Таймер нужен для того, что бы можно было понять когда был запущен последний раз браузер, сколько времени он должен быть открыть и сколько времени осталось до конца.
Задержку записанную в INI я использую в виде минут и потом перевожу их в мс. Это для удобства настройки.
Количество строк в 123.txt периодически изменяется, посему добавлена переменная last_line.
Впринципе скрипт реализован криво и топорно, но он работает и это самое главное. Не работает только WinHide. Если в параметрах запуска не стоял параметр Hide и браузер запустился "как есть", либо было использовано WinShow, то спрятать окно браузера уже не получается, по сути пункт

Menu, Tray, Add, &Спрятать в трей, HMM

выполняет роль декорации.