1

Тема: 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

Какой командой это можно осуществить? Спасибо!

2

Re: AHK: Добавление переменной

Этот скрипт у меня на Windows XP не работает.

Насколько я понимаю, нужно изменить массив myItems, затем выполнить вот эту часть скрипта:

DllCall("RegisterShellHookWindow", UInt, A_ScriptHwnd)
CreateMyMenu := Func("CreateMyMenu").Bind(myMenuName, myItems)
ShellProc := Func("ShellProc").Bind(winClass, CreateMyMenu)

3

Re: AHK: Добавление переменной

ypppu, а какой же коммандой добавить переменную в массив?

4

Re: AHK: Добавление переменной

Оператором присвоения.

myItems := ["Item1", "Item2", "Item3", "Item4"]

5

Re: AHK: Добавление переменной

ypppu, как автоматически добавить пункт через запятую в данный массив? Нажимаю на кнопку - пункт добавляется в файле сценария.

6

Re: AHK: Добавление переменной

В файл скрипта можно дописывать командой FileAppend.

7

Re: AHK: Добавление переменной

ypppu, в справке не нашел примера, как добавить текст в заданное поле (массив).

8 (изменено: ypppu, 2016-12-12 16:47:42)

Re: AHK: Добавление переменной

becauseim пишет:

в справке не нашел примера

Поищите в англоязычной по слову "Array".

Например так.

myItems := ["Item1", "Item2", "Item3", "Item4"]
myItems[5] := "Item5"
Loop, 5
MsgBox, % myItems[A_Index]

Если нужно просто добавить в конец, без учёта порядкового номера:

myItems := ["Item1", "Item2", "Item3", "Item4"]
myItems.Push("Item5", "Item6")
Loop, 6
MsgBox, % myItems[A_Index]