Тема: AHK: Добавление переменной
В соседней теме предлагался следующий сценарий, позволяющий разместить пользовательские пункты в панели меню стандартного окна:
#SingleInstance Force
winClass := "Notepad"
myMenuName := "MyMenu"
myItems := ["Item1", "Item2"]
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)
}
Отдельным действием хотелось бы добавлять пункты меню, т.е. добавлять переменные в myItems:
^+vk43:: ; с
ClipBoard := ""
Send, ^{vk43} ; с
InputBox, clipboardID, Save Preset, Preset Name:, , 180, 130
FileAppend, %ClipBoardAll%, %clipboardID%
; Добавить пункт меню (переменную) "%clipboardID%"
return
Какой командой это можно осуществить? Спасибо!

