Тема: AHK: Как создать свое меню в SciTE4AutoHotkey
Добрый день! Подскажите, пожалуйста, кто знает. Как создать свое меню в редакторе SciTE4AutoHotkey, вверху, там где находится: Tools, Options и т.д? Я что-то запутался. Заранее спасибо!
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Добрый день! Подскажите, пожалуйста, кто знает. Как создать свое меню в редакторе SciTE4AutoHotkey, вверху, там где находится: Tools, Options и т.д? Я что-то запутался. Заранее спасибо!
А что именно непонятно?
Ну вот, я создал свои пункты в меню Tools, я хочу как бы отдельно создать свое меню, со своими пунктами, чтобы щелкнуть и выбрать нужный пункт, но что-то затормозился я и не могу найти инструкцию, как такое сделать.
Вот пример для Блокнота:
winClass := "Notepad"
myMenuName := "MyMenu"
myItems := ["Item 1", "Item 2"]
DllCall("RegisterShellHookWindow", UInt, A_ScriptHwnd)
CreateMyMenu := Func("CreateMyMenu").Bind(myMenuName, myItems)
ShellProc := Func("ShellProc").Bind(winClass, CreateMyMenu)
OnMessage(DllCall("RegisterWindowMessage", Str, "SHELLHOOK"), ShellProc)
OnExit("Exit")
Return
~LButton::
if item := IsMouseOverMyMenu(winClass, myItems)
MsgBox, % item
Return
CreateMyMenu(menuName, items, hWnd) {
hMyMenu := DllCall("CreateMenu")
for k, v in items
DllCall("AppendMenu", Ptr, hMyMenu, UInt, MF_STRING := 0, UInt, "", Str, v)
hMenu := DllCall("GetMenu", Ptr, hWnd, Ptr)
DllCall("AppendMenu", Ptr, hMenu, UInt, MF_POPUP := 0x10, Ptr, hMyMenu, Str, menuName)
DllCall("DrawMenuBar", Ptr, hWnd)
}
ShellProc(myClass, myFunc, nCode, wParam) {
if ( nCode = (HSHELL_WINDOWCREATED := 1) ) {
WinGetClass, winClass, ahk_id %wParam%
if (winClass = myClass)
myFunc.Call(wParam)
}
}
IsMouseOverMyMenu(myClass, items) {
WinGetClass, winClass, A
if (winClass != myClass)
Return
MouseGetPos,,, ID
WinGetClass, winClass, ahk_id %ID%
if (winClass != "#32768")
Return
AccObj := AccObjectFromPoint(child)
item := AccObj.AccName(child)
for k, v in items
if (v == item)
Return item
}
AccObjectFromPoint(ByRef _idChild_ = "", x = "", y = "") {
static VT_DISPATCH := 9, h := DllCall("LoadLibrary", Str, "oleacc", Ptr)
(x = "" || y = "") ? DllCall("GetCursorPos", Int64P, pt) : pt := x & 0xFFFFFFFF | y << 32
VarSetCapacity(varChild, 8 + 2*A_PtrSize, 0)
if DllCall("oleacc\AccessibleObjectFromPoint", Int64, pt, PtrP, pAcc, Ptr, &varChild) = 0
Return ComObjEnwrap(VT_DISPATCH, pAcc, 1), _idChild_ := NumGet(varChild, 8, "UInt")
}
Exit() {
DllCall("DeregisterShellHookWindow", UInt, A_ScriptHwnd)
}
Сначала запустить скрипт, потом блокнот. Названия пунктов меню должны быть уникальны.
Да уж, ни думал, что такой скрипт получится, а как хоть вставить свои команды в: Item 1, Item 2?
Попробуйте сами догадаться. Где в коде item определяется? Там в зависимости от результата свою метку или функцию прописываете.
Спасибо, конечно, но через раз работает в SciTE4. Тогда уж проще свое меню создать командой Menu, муторно, но надежно.
Ну, я так понял, что вопросов у вас нет, так создавайте.
Так особо никаких вопрос нет на данный момент, но еще такой вопрос есть: в команде "Menu, Tray, Default" - выделяет все жирным цветом, есть такое:
Menu, Tray, Add, &Пауза, Script
Menu, Tray, Default, &Пауза
Menu, Tray, Add, &Exit, Script1
Menu, Tray, Default, &Exit
, но &Пауза не выделяется жирным цветом, может, сам найду ответ покопаюсь, но если знаете, дайте ответ. Как выделить все пункты меню жирным шрифтом? Заранее спасибо.
Default переводится "по умолчанию", а не "выделить жирным". По умолчанию может быть только какой-то один пункт, он и будет выбран при двойном щелчке по иконке в трее.
как выделить все пункты меню жирным шрифтом
Предполагаю, что код будет не менее навороченный, чем в 4 посте.
Да, согласен, "век живи - век учись", но это я для примера показал. Мне другое меню надо выделить, обычное, ни в трее которое. Да, знаю что Default переводится как "по умолчанию", но я руководствовался вот этим правилом справки:
(Применение этой команды ко всем меню, кроме того, что в области уведомлений, в настоящее время даёт лишь косметический эффект). Так, что вопрос все тот же, если какой-нибудь способ, сделать шрифты пунктов меню, жирнее, чем они есть?
Я так понимаю, это ООП или классы. В этой теме, я вообще ничего не понимаю. Думаю, лучше оставлю как есть. Спасибо всем за ответы.
teadrinker, какой командой можно добавить пункт в myItems?
becauseim, не совсем ясен вопрос. myItems — это просто название переменной.
teadrinker, как при помощи команды FileAppend добавить пункт меню (переменную в массив myItems) в упомянутый сценарий?
При помощи FileAppend никак. Методы объектов здесь. Чтобы добавить в конец, используется Push:
myItems := ["Item 1", "Item 2"]
myItems.Push("Item 3")
MsgBox, % myItems[3]
Решил свой вопрос редактированием SciTE.exe в программе Restorator, может, кому-нибудь понадобится.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться