51

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

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

вот:

+ открыть спойлер
Global Hwnd_menu
    ~RButton::
    Hwnd_menu := ""
    WinWait ahk_class #32768, , 01
    if ErrorLevel
        return
    WinGet Hwnd_menu, ID,ahk_class #32768
return

#if Getpos()
lbutton::tooltip % Acc_ObjectFromPoint(c).AccName(c)

Acc_Init()
{
    Static    h
    If Not    h
        h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}


Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "")
{
    Acc_Init()
    If    DllCall("oleacc\AccessibleObjectFromPoint", "Int64", x==""||y==""?0*DllCall("GetCursorPos","Int64*",pt)+pt:x&0xFFFFFFFF|y<<32, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
    Return    ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}

Acc_ObjectFromEvent(ByRef _idChild_, hWnd, idObject, idChild)
{
    Acc_Init()
    If    DllCall("oleacc\AccessibleObjectFromEvent", "Ptr", hWnd, "UInt", idObject, "UInt", idChild, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
    Return    ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}

Acc_Parent(Acc) { 
    try parent:=Acc.accParent
    return parent?Acc_Query(parent):
}

Acc_Query(Acc) { ; thanks Lexikos - www.autohotkey.com/forum/viewtopic.php?t=81731&p=509530#509530
    try return ComObj(9, ComObjQuery(Acc,"{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1)
}

Acc_WindowFromObject(pacc)
{
    If    DllCall("oleacc\WindowFromAccessibleObject", "Ptr", IsObject(pacc)?ComObjValue(pacc):pacc, "Ptr*", hWnd)=0
    Return    hWnd
}


Getpos(){
MouseGetPos, , , id
Acc := Acc_ObjectFromEvent(c,id,0, 0)
loop
    if Acc_Parent(    Acc_Parent(    Acc_Parent(    Acc ))).AccRole(c) = 9
        Acc := Acc_Parent(    Acc_Parent(    Acc_Parent(    Acc )))
    else
        break
    if (Acc_WindowFromObject(Acc) = Hwnd_menu)
        return 1
}    

52

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Теперь если нажать правую кнопку и выбрать левой пункт меню — определяется. Но если снова нажать правую и выбрать другой пункт меню — не срабатывает.

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

53

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Ну ок немного ляп. Но если его в порядок привести нормально для коллекции будет?

54

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Думаю, да.

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

55 (изменено: yalanne, 2015-07-07 02:32:41)

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Вроде исправил косяки.
И сделал что бы на дочерних списках прописывался путь.

+ открыть спойлер
Acc_Init()
{
    Static    h
    If Not    h
        h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}


Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "")
{
    Acc_Init()
    If    DllCall("oleacc\AccessibleObjectFromPoint", "Int64", x==""||y==""?0*DllCall("GetCursorPos","Int64*",pt)+pt:x&0xFFFFFFFF|y<<32, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
    Return    ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}

Acc_ObjectFromEvent(ByRef _idChild_, hWnd, idObject, idChild)
{
    Acc_Init()
    If    DllCall("oleacc\AccessibleObjectFromEvent", "Ptr", hWnd, "UInt", idObject, "UInt", idChild, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
    Return    ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}

Acc_Parent(Acc) { 
    try parent:=Acc.accParent
    return parent?Acc_Query(parent):
}

Acc_Query(Acc) { ; thanks Lexikos - www.autohotkey.com/forum/viewtopic.php?t=81731&p=509530#509530
    try return ComObj(9, ComObjQuery(Acc,"{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1)
}

Acc_WindowFromObject(pacc)
{
    If    DllCall("oleacc\WindowFromAccessibleObject", "Ptr", IsObject(pacc)?ComObjValue(pacc):pacc, "Ptr*", hWnd)=0
    Return    hWnd
}

Get32768(){
MouseGetPos, , , id
WinGetClass class,ahk_id %id%
if  (class = "#32768")
    return 1
}



#if Get32768()
LButton::
tName := []
Name := []
Acc := Acc_ObjectFromPoint(c)
tName.Insert(Acc.AccName(c))

loop
{
Acc:= Acc_Parent(    Acc    )
if (Acc.AccRole() = 9)
    tName.Insert(Acc.AccName())
if (Acc.AccRole() = "")
    break
}
tName.Remove(tName.MaxIndex())

loop % tName.MaxIndex()
name := (!name?"":"::::") tName[A_Index] name

tooltip % name

return

56

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Отлично, вроде всё работает. Для реального скрипта лучше оставить работоспособность меню, а названия прописывать, например, в трейтипе.

А теперь подкидываю идею для по-настоящему интересного скрипта: добавлять в любое стандартное меню любой программы свои пункты и отслеживать клики по ним. Как получать доступ к меню здесь были, вроде, темы.

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

57 (изменено: yalanne, 2015-07-07 22:11:48)

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Нашел вроде что бы пункты добавлять:

DllCall("AppendMenu", "UInt", hSysMenu, "UInt", 0x00000800)   ; MF_SEPARATOR   
DllCall("AppendMenu", "UInt", hSysMenu, "UInt", 0, "UInt", 0x1001, "Str", "Item 1")    
DllCall("DrawMenuBar", "UInt", hGui)  

но что то не получается добавить.


И вот тот код что бы нажатый пункт показывать трейтип:

+ открыть спойлер
Acc_Init()
{
    Static    h
    If Not    h
        h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}


Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "")
{
    Acc_Init()
    If    DllCall("oleacc\AccessibleObjectFromPoint", "Int64", x==""||y==""?0*DllCall("GetCursorPos","Int64*",pt)+pt:x&0xFFFFFFFF|y<<32, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
    Return    ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}

Acc_ObjectFromEvent(ByRef _idChild_, hWnd, idObject, idChild)
{
    Acc_Init()
    If    DllCall("oleacc\AccessibleObjectFromEvent", "Ptr", hWnd, "UInt", idObject, "UInt", idChild, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
    Return    ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}

Acc_Parent(Acc) { 
    try parent:=Acc.accParent
    return parent?Acc_Query(parent):
}

Acc_Query(Acc) { ; thanks Lexikos - www.autohotkey.com/forum/viewtopic.php?t=81731&p=509530#509530
    try return ComObj(9, ComObjQuery(Acc,"{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1)
}

Acc_WindowFromObject(pacc)
{
    If    DllCall("oleacc\WindowFromAccessibleObject", "Ptr", IsObject(pacc)?ComObjValue(pacc):pacc, "Ptr*", hWnd)=0
    Return    hWnd
}

Get32768(){
MouseGetPos, , , id
WinGetClass class,ahk_id %id%
if  (class = "#32768")
    return 1
}



#if Get32768()
~LButton::
tName := []
Name := []
Acc := Acc_ObjectFromPoint(c)
tName.Insert(Acc.AccName(c))

loop
{
Acc:= Acc_Parent(    Acc    )
if (Acc.AccRole() = 9)
    tName.Insert(Acc.AccName())
if (Acc.AccRole() = "")
    break
}
tName.Remove(tName.MaxIndex())
if WinActive( tName[tName.MaxIndex()] )
    tName.Remove(tName.MaxIndex())

loop % tName.MaxIndex()
name := (!name?"":"::::") tName[A_Index] name

TrayTip,, %  name

return

58

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

yalanne пишет:

Нашел вроде что бы пункты добавлять

Где нашли-то? Там полного кода не было?

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

59

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Gui, Show, w444 h444, % " "
Gui, +HWNDhGui +ReSize 
OnMessage(0x112, "WM_SYSCOMMAND") 
  
hSysMenu := DllCall("GetSystemMenu", "UInt", hGui, "UInt", 0)      
DllCall("AppendMenu", "UInt", hSysMenu, "UInt", 0x00000800)   ; MF_SEPARATOR   
DllCall("AppendMenu", "UInt", hSysMenu, "UInt", 0, "UInt", 0x1001, "Str", "Item 1")    
DllCall("AppendMenu", "UInt", hSysMenu, "UInt", 0, "UInt", 0x1002, "Str", "Item 2")  
DllCall("AppendMenu", "UInt", hSysMenu, "UInt", 0, "UInt", 0x1003, "Str", "Item 3")     
DllCall("DrawMenuBar", "UInt", hGui)  
 
WM_SYSCOMMAND(wParam, lParam)
{ 
    If wParam between 0x1001 and 0x1003
    {  
        ToolTip % wParam
    }
}
Return

60

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

teadrinker Так ты просто всё распиши, а за ним всё самое сложное, в коллекцию добавить не каждый сможет.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

61 (изменено: teadrinker, 2015-07-08 01:34:16)

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Ну, всему сразу не научишься. yalanne, там у вас используется функция GetSystemMenu. По её названию можно понять, что речь идёт о системном меню — это то, которое появляется, если кликнуть правой кнопкой по заголовку окна. В принципе, добавлять можно и туда, но оно редко используется. Лучше добавлять в обычный менюбар. Вот пример, добавляем дополнительный пункт со своим подменю в менюбар блокнота:

Menu, Submenu, Add, Item 1, Example
Menu, Submenu, Add, Item 2, Example
hSubmenu := GethMenu("Submenu")

if !hWnd := WinExist("ahk_class Notepad")  {
   Run, notepad.exe,,, PID
   WinWait, ahk_pid %PID%
   hWnd := WinExist("ahk_pid" PID)
}
hMenu := DllCall("GetMenu", Ptr, hWnd, Ptr)
DllCall("AppendMenu", Ptr, hMenu, UInt, MF_POPUP := 0x10, Ptr, hSubmenu, Str, "MyMenu")
DllCall("DrawMenuBar", Ptr, hWnd)
WinActivate
ExitApp

Example:
   Return

GethMenu(MenuName)
{
   Gui, New, +hwndhGui
   Menu, _MyMenuBar, Add, File, :%MenuName%
   Gui, Menu, _MyMenuBar
   hMenu := DllCall("GetMenu", Ptr, hGui, Ptr)
   hMenu := DllCall("GetSubMenu", Ptr, hMenu, Int, 0)
   Gui, Destroy
   Menu, _MyMenuBar, Delete, File
   Menu, _MyMenuBar, Delete
   Return hMenu
}

Меню не пропадает после завершения работы скрипта. Однако метки срабатывать не будут.
Можно также добавлять пункты в уже существующие подменю, попозже напишу, если не разберётесь.

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

62

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Но лучше так:

hSubmenu := DllCall("CreateMenu")
DllCall("AppendMenu", Ptr, hSubmenu, UInt, MF_STRING := 0, UInt, "", Str, "Item 1")
DllCall("AppendMenu", Ptr, hSubmenu, UInt, MF_STRING := 0, UInt, "", Str, "Item 2")

if !hWnd := WinExist("ahk_class Notepad")  {
   Run, notepad.exe,,, PID
   WinWait, ahk_pid %PID%
   hWnd := WinExist("ahk_pid" PID)
}
hMenu := DllCall("GetMenu", Ptr, hWnd, Ptr)
DllCall("AppendMenu", Ptr, hMenu, UInt, MF_POPUP := 0x10, Ptr, hSubmenu, Str, "MyMenu")
DllCall("DrawMenuBar", Ptr, hWnd)
WinActivate
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

63 (изменено: yalanne, 2015-07-08 13:56:41)

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Acc не видит пункты в этом искусственном меню.

+ MyMenu

http://i.imgur.com/xiwaOum.jpg

+ любой другой

http://i.imgur.com/Za2W8Po.jpg

Следственно и мой скрипт не сможет их определить.

64

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Всё проще оказалось. Меню "умирает", когда скрипт завершает работу. Но определить его пункт, по которому кликнули, оказалось, можно и без Accessible:

hMyMenu := DllCall("CreateMenu")
DllCall("AppendMenu", Ptr, hMyMenu, UInt, MF_STRING := 0, UInt, "", Str, "Item 1")
DllCall("AppendMenu", Ptr, hMyMenu, UInt, MF_STRING := 0, UInt, "", Str, "Item 2")

if !hWnd := WinExist("ahk_class Notepad")  {
   Run, notepad.exe,,, PID
   WinWait, ahk_pid %PID%
   hWnd := WinExist("ahk_pid" PID)
}
hMenu := DllCall("GetMenu", Ptr, hWnd, Ptr)
DllCall("AppendMenu", Ptr, hMenu, UInt, MF_POPUP := 0x10, Ptr, hMyMenu, Str, "MyMenu")
DllCall("DrawMenuBar", Ptr, hWnd)
WinActivate
Return

~LButton::
   DllCall("GetCursorPos", Int64P, POINT)
   res := DllCall("MenuItemFromPoint", Ptr, hWnd, Ptr, hMyMenu, Int64, POINT)
   if (res >= 0)
      MsgBox, % res + 1
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

65

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Вот чего нашёл: Кибор - среда, специально заточенная для удобного написания скриптов для автоматизации действий на компьютере.

66 (изменено: yalanne, 2015-08-04 00:30:42)

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

teadrinker, я сделал что бы в каждое контекстное меню добавлялось своя кнопка и что бы она работало вот пример:

#SingleInstance Force
#Persistent
SetBatchLines,-1
Global bt
HookProcAdr := RegisterCallback( "HookProc", "F" ), hWinEventHook := SetWinEventHook( 0x1, 0x17, 0, HookProcAdr, 0, 0, 0 )
SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags) 
{
    DllCall("CoInitialize", Uint, 0)
    return DllCall("SetWinEventHook", Uint,eventMin    , Uint,eventMax    , Uint,hmodWinEventProc
    , Uint,lpfnWinEventProc, Uint,idProcess, Uint,idThread, Uint,dwFlags)    
}
HookProc( hWinEventHook, Event, hWnd, idObject, idChild, dwEventThread, dwmsEventTime )
{
if (Event = 6)
    {
    Winwait ahk_class #32768
    WinGetPos,x,y,w,h,ahk_id %hWnd%
    WinMove ahk_id %hWnd%,,%x%,%y%,%w%,% h+30
    Gui, Add, button,% "w" w " h30 x0 y" h " Left HWNDh_bt",тест
    DllCall("SetParent", "uint", h_bt, "uint", hWnd)
    }
}

Getbt_32768(){
MouseGetPos, , ,id ,ctrl
if (WinExist("ahk_class #32768") = id) and !(ctrl="") and (bt:=ctrl)
    return 1
}
return


#if Getbt_32768()
Lbutton::msgbox % bt

Конечно это не совсем контекстная кнопка а простая).

67

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Не, во-первых, сам подход не годится — если меню будет снизу экрана, кнопка будет за экраном (да и почему именно кнопка, а не новый пункт меню?), и зачем добавлять в каждое меню?; во-вторых ещё и написано криво, явно содрано с какого-то древнего поста времён ahk-basic. В таких штуках желательно разобраться перед применением.

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

68 (изменено: NektoN95, 2015-08-04 08:07:47)

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Вот чего нашёл: Кибор - среда, специально заточенная для удобного написания скриптов для автоматизации действий на компьютере.

Имхо, для написания скриптов для ОС и приложений Кибор не шибко-то превосходит AHK по удобству и широте возможностей.

P. S. Хотя в области ботописания для онлайн игр он впереди планеты всей благодаря функции анти-антикликера и возможности поиска движущихся обьектов...

69 (изменено: yalanne, 2015-08-04 11:01:08)

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Посты по поводу контекстного меню в отдельную тему бы перенести, а то оффтоп.

70

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

NektoN95 пишет:

Имхо, для написания скриптов для ОС и приложений Кибор не шибко-то превосходит AHK по удобству и широте возможностей.

Не понял.
Кибор - это IDE, а AHK - язык программирования.
Т.е. Вы сравниваете тёплое с пушистым.

71

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Язык программирования Кибор имеет Си образный синтаксис.

Кибор - это язык, у него есть IDE заточенное соответственно только под него, причём тут вообще AutoHotkey?

Интегри́рованная среда́ разрабо́тки, IDE (англ. Integrated development environment) — система программных средств, используемая программистами для разработки программного обеспечения (ПО).

Вам собственно каких программных средств нехватает?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

72 (изменено: DD, 2019-04-14 01:13:08)

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Помню, на оф. форуме был скрипт, автоматически расставлявший отступы и правивший названия команд и тд, согласно принятому формату. Не будет ли ссылки на него? А то ни на компе, ни там найти не могу).

73

Re: AHK: Всё про инструменты для AutoHotKey (макрорекордеры, IDE и т.п.)

Первое что попалось в поиске.

Editors with AutoHotkey Support:
SciTE4AutoHotkey (Smart auto-indent)

AHK Auto Formatter?

+ DD