1 (изменено: ponomarev.cs, 2018-10-29 23:45:13)

Тема: AHK: Управление функцией, при помощи параметра другой функции

Хочу сделать код, который формирует пункты меню, более компактным, при этом чтобы пути к EXE файлам и иконкам хранились в переменных.
В результате сделал две простые функции:
StMenu - для пунктов меню, которые используют иконку EXE файла.
StMenuCI - для пунктов меню, которые используют сторонние иконки.

Пример:

Menu, progs, UseErrorLevel

chrome:="C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
firefox:="C:\Program Files\Mozilla Firefox\firefox.exe"

StMenu("Mozilla Firefox", "firefox", "progs")
StMenu("Google Chrome", "chrome", "progs")
StMenuCI("Mozilla Firefox Custom Icon", "firefox", chrome, "", "", "progs")
Return

chrome:
try Run, %chrome%
Return

firefox:
try Run, %firefox%
Return

VK5D::Menu, progs, Show ; Menu Key
return

StMenu(itemname, handlername, menuname){
	Menu, %menuname%, Add, %itemname%, %handlername%
	iconpath:=%handlername%
	Menu, %menuname%, Icon, %itemname%, %iconpath%,,
}
return

StMenuCI(itemname, handlername, iconpath, n1, n2, menuname){
	Menu, %menuname%, Add, %itemname%, %handlername%
	Menu, %menuname%, Icon, %itemname%, %iconpath%,%n1%,%n2%
}
return

Как правильно добавить ту часть кода, которая отвечает за запуск EXE в функцию, и возможно ли управлять ею через параметр?
Т.е. допустим у нас есть функция StMenuH и есть параметр, значение которого содержит путь к EXE файлу. Как его передать второй функции Handler? Или, быть может есть другой способ, как это всё правильно объединить?

Если сделать так, то при выборе любого пункта, будет запускаться EXE который соответствует последнему пункту меню.

Menu, progs, UseErrorLevel

chrome:="C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
firefox:="C:\Program Files\Mozilla Firefox\firefox.exe"

StMenuH("Mozilla Firefox", "firefox", "progs")
StMenuH("Google Chrome", "chrome", "progs")
Return

VK5D::Menu, progs, Show ; Menu Key
return

StMenuH(itemname, handlername, menuname){
	Global
	Menu, %menuname%, Add, %itemname%, Handler
	iconpath:=%handlername%
	Menu, %menuname%, Icon, %itemname%, %iconpath%,,
}
return

Handler()  {
	Global
	try Run, %iconpath%
}

P.S.Пока только изучаю возможности AHK и стандартного меню, так что сразу извиняюсь если код выглядит как очередной кривой велосипед.

2

Re: AHK: Управление функцией, при помощи параметра другой функции

fn:=Func("my_function")

id:=_MenuManager("create")
_MenuManager("newitem",id,"firefox",{title:"Mozilla Firefox",callback:fn})
_MenuManager("newitem",id,"chrome",{title:"Google Chrome",callback:fn,icon:"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"})

_MenuManager("setmenu",id) ;В трей
Return
f1::reload
return

my_function(what=0,title=0) {
	msgbox % what
	chrome:="C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
	firefox:="C:\Program Files\Mozilla Firefox\firefox.exe"
	if (what="firefox") {
		try Run, % firefox

	} else if(what="chrome") {
		try Run, % chrome
	}
}


_MenuManager(func,id=0,name=0,value=0) {
	static menus:=[],n:=0
	if (func="create") {
		menus[++n]:=[]
		return n
	} else if(func="newitem") {
		if(!_MenuManager("getIndex",id))
			return 0
		menus[id][name]:=value
		return 1
	} else if(func="delitem") {
		if(!_MenuManager("getIndex",id))
			return 0
		menus[id].Delete(name)
		return 1
	} else if(func="getIndex") {
		for i in menus
			if(i=id)
				return i
		return 0
	} else if(func="setmenu") {
		if(!_MenuManager("getIndex",id))
			return 0
		Menu, Tray, NoStandard
		Menu, Tray, DeleteAll
		for name,obj in menus[id] {
			fn:=obj.callback
			Menu, Tray, Add,  % obj.title, % fn
			if(obj.icon)
				try Menu, Tray, Icon, % obj.title, % obj.icon,,
		} return 1
	}
}

3

Re: AHK: Управление функцией, при помощи параметра другой функции

MandarinKa02
Спасибо. Попробую разобраться. Хотя, выглядит, как-то чересчур мудрёно.

4

Re: AHK: Управление функцией, при помощи параметра другой функции

ponomarev.cs, что здесь мудреного?