26 (изменено: Доктор ТуамОсес, 2015-07-02 00:09:19)

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

teadrinker пишет:

люди, "которые тоже интересуются автоматизацией работы на компе и которые много чего знают по тематике разработки скриптов" практически никогда не интересуются инструментами типа AutoScriptWriter.

Но зато, они наверняка интересуются средами для разработки, оптимизации, верификации и отладки кода скриптов. И инструментами создания переносимых между компами и платформами скриптов.
Пусть про это расскажут. Ибо это всё в рамках темы.

27

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

Irbis пишет:

Применяя вашу же логику, зачем вам разбираться со сложным навороченным редактором макросов с IDE? Проще "накликать" в AutoScriptWriter шаблон.

Ну...
Во-первых (касается "проще накликать"), даже когда "кликов" всего с десяток и то с кодом, состоящим только из "Click,Click,Click,Click,Click,..." уже достаточно трудно разобраться. Потому что приходится ломать голову какой клик за что отвечает. А что уж говорить когда кликов становится под сотню - то вообще труба. Поэтому с таким шаблоном трудно работать.
Во-вторых, (касается "навороченного редактора макросов с IDE"), я не только одноразовые простые"автокликалки" пишу. Иногда, когда нужно заставить работать "в одной упряжке" (т.е. взаимодействуя друг с другом) сразу несколько приложений или когда нужно расширить функционал некоторого приложения с помощью AHK, то приходится писать скрипты с довольно сложной логикой с нуля "ручками"(без использования автоматической макрописалки).

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

Я хочу преодолеть эти ограничения.
Поэтому я и озадачился поиском таких инструментов.

28

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

AHK последних версий ещё не научился различать куда кликнул юзверь: по пункту меню (и по какому конкретно) или же по какому-то (какому конкретно) объекту в рабочем поле программы?

Т.е. новые версии AHK ещё не научились забираться в "кишки" отслеживаемой программы? И могут считывать только title и координаты?

Да он и старенький, с нужными библиотеками всё мог.
У вас много: хочу чтобы так было и баста, и как следствие "холодно".
Любой универсальный рекордер, инструмент примитивный. Технологии AutoHotkey давно позволяют осуществить желаемое, но под каждую хотелку готового скрипта нет. Задачи на самом деле, слишком специфичны. Для работы с конкретными программами, да ещё и их понятным комментированием, уже наверняка нужны и спец. сценарии.

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

29 (изменено: Доктор ТуамОсес, 2015-07-02 02:57:30)

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

serzh82saratov пишет:

Да он и старенький, с нужными библиотеками всё мог.

Поясните. Как можно узнать, что указатель мыши в момент клика был на некотором пункте меню и на каком конкретно.
Не создавать же для этого вопроса отдельную тему.
А ответ очень важен мне.
И вдовесок близкий к этому вопрос: как можно с помощью AHK позиционировать указатель мыши на пункт меню с заданным текстом без использования OCR-библиотек, а просто залезя в "кишки" Windows?

30

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

Доктор ТуамОсес пишет:

Во-первых, я не профессиональный программист. Поэтому отвечу "НЕ ЗНАЮ КАК". Пусть программисты-разработчики скриптописалок думают.

А здесь нет профессиональных программистов. Так что придётся вам самому под себя рекордер делать.

31

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

Как можно узнать, что указатель мыши в момент клика был на некотором пункте меню и на каком конкретно.

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

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

32 (изменено: Доктор ТуамОсес, 2015-07-03 23:10:45)

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

Да мне, честно говоря, "не до жиру".
Вы хотя бы научите меня, как со "стандартными" работать раз уж Вы говорите, что "... он и старенький, с нужными библиотеками всё мог", чтобы Ваши слова не выглядели голословными (как "пук в лужу").
Вот как мне узнать, через сколько миллисекунд после клайка правой кнопкой мыши открылось контекстное меню и как прочитать название пункта меню, на который в данный момент я навёл указатель мыши?

33

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

чтобы Ваши слова не выглядели как "пук в лужу".

Ну лично я, за то, чтобы оно вам так и казалось, чем кому-то что-то доказывать.

Вы хотя бы научите меня

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

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

34

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

Понял. Значит не знаете как в AHK узнать (без использования функций OCR (т.е. без распознавания текста на картинке), а чисто залазия в "кишки" Windows), что мышь "висит" над контекстным меню и над каким конкретно пунктом. Я так и думал.

А насчет "пука в лужу" извините. Погорячился. Просто не люблю когда люди говорят бездоказательно весьма сомнительные вещи.

35

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

OFF: Доктор, вы, случаем, не проктолог по специализации?

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

36

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

Значит не знаете как

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

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

37

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

serzh82saratov пишет:

Значит не знаете как

Как в стандартном меню знаю, и знают ещё много людей.

Никто не знает. Потому что этого невозможно. Если б знали - давно бы написали. Ибо я когда знаю и могу помочь - всегда пишу. Так и люди ВСЕ поступают.

А почему Вы все ремя делаете упор на слове "стандартном"?
Что это значит? Разве в венде есть ещё и не стандартные меню?
Ведь любые программы для создания всех меню в венде используют одну и ту же вендовую DLL. Разве нет?

38

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

Не в "венде", а в программах. Как автор программы реализует функционал меню — его личное дело. Может использовать и то, что ОС предоставляет, но не обязан.

39 (изменено: serzh82saratov, 2015-07-04 14:49:25)

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

Никто не знает. Потому что этого невозможно. Если б знали - давно бы написали. Ибо я когда знаю и могу помочь - всегда пишу. Так и люди ВСЕ поступают.

Ну по себе всех судить не надо, возможно стиль вашего общения, не способствует желанию оказания помощи. Ну а на счёт никто не знает, и невозможно, действительно необоснованное заявление. Например такой скрипт обводит пункт и выводит его имя, делает он это через acessible интерфейс, но можно ещё и по другому.

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

40 (изменено: Доктор ТуамОсес, 2015-07-04 15:30:46)

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

YMP пишет:

Не в "венде", а в программах. Как автор программы реализует функционал меню — его личное дело. Может использовать и то, что ОС предоставляет, но не обязан.

Я не име в виду всякие извраты.
Я имел в виду программы, создающие меню штатными средствами Windows (через встроенные в Windows API, DLL).
Как в AHK можно узнать в какой момент контекстное меню открылось/закрылось, какие пункты содержатся в данном меню и над какими пунктом меню (т.е. прочитать название данного пункта) находится в данный момент указатель мыши

41

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

serzh82saratov пишет:

Ну по себе всех судить не надо

Я не сужу.
Я, напротив, о людях всегда хорошо думаю (типа "раз я всегда готов помочь - то и остальные люди тоже добрые как и я").
Пока человек не докажет мне обратное.
Вот Вы ещё немного и докажете мне.

42

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

serzh82saratov пишет:

Ну а на счёт никто не знает, и невозможно, действительно необоснованное заявление. Например такой скрипт обводит пункт и выводит его имя, делает он это через acessible интерфейс, но можно ещё и по другому.

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

43

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

Доктор ТуамОсес пишет:

Я имел в виду программы, создающие меню штатными средствами Windows (через встроенные в Windows API, DLL).
Как в AHK можно узнать в какой момент контекстное меню открылось/закрылось, какие пункты содержатся в данном меню и над какими пунктом меню (т.е. прочитать название данного пункта) находится в данный момент указатель мыши

MouseGetPos
Считывает текущее положение курсора мыши, а также определяет, какое окно и какой контрол находятся под курсором.
MouseGetPos, [OutputVarX, OutputVarY, OutputVarWin, OutputVarControl, 1|2|3]



ControlGet
Считывает разнообразную информацию о контролах (элементах управления) окна.
ControlGet, OutputVar, Cmd [, Value, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]

44 (изменено: yalanne, 2015-07-04 21:56:59)

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

Доктор ТуамОсес пишет:

Поясните. Как можно узнать, что указатель мыши в момент клика был на некотором пункте меню и на каком конкретно.

Вот:

+ код
; If с решеткой влияет на действие клавиш при определенных ситуациях.
; Скрипт работает через Acc Library
; С помощью Acc_ObjectFromPoint производится проверка элемента, который находится под курсором. А точнее проверяется роль в системе.  Список ролей и их описание опишу ниже.
; первый раз в 'c' заносится(создается переменная) дочерний id элемента. А во второй раз читает этот id.
; 33  (0x00000021 hex) это роль ROLE_SYSTEM_LIST.
; для windows рабочий стол это listbox, просто модифицированный. 
#if Acc_ObjectFromPoint(c).AccRole(c) = 33
; И так если курсор находится на пустом месте рабочего стола или на пустом месте listbox'а какой нибуть проги, то
    ~RButton:: ; при нажатии правой кнопки мыши
    Hwnd_menu := "" ;(сброс с прошлого потока)
    WinWait ahk_class #32768, , 01 ; ждем открытие окна меню.
    if ErrorLevel 
        return 
    WinGet Hwnd_menu, ID,ahk_class #32768 ; если окно найдено получаем его hwnd
return

#if Hwnd_menu = Getpos()  ; При нажатии левой кнопки мыши сравниваем hwnd окна меню и то что под мышкой
; если истина то показываем тултип.
    LButton::tooltip % "Нажата кнопка '" Acc_ObjectFromPoint(c).AccName(c) "'" 
return
#if

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")
}

Getpos(){
MouseGetPos, , , id
return id
}    
    
+ роли
ROLE_SYSTEM_TITLEBAR            = 0x00000001
ROLE_SYSTEM_MENUBAR             = 0x00000002
ROLE_SYSTEM_SCROLLBAR           = 0x00000003
ROLE_SYSTEM_GRIP                = 0x00000004
ROLE_SYSTEM_SOUND               = 0x00000005
ROLE_SYSTEM_CURSOR              = 0x00000006
ROLE_SYSTEM_CARET               = 0x00000007
ROLE_SYSTEM_ALERT               = 0x00000008
ROLE_SYSTEM_WINDOW              = 0x00000009
ROLE_SYSTEM_CLIENT              = 0x0000000A
ROLE_SYSTEM_MENUPOPUP           = 0x0000000B
ROLE_SYSTEM_MENUITEM            = 0x0000000C
ROLE_SYSTEM_TOOLTIP             = 0x0000000D
ROLE_SYSTEM_APPLICATION         = 0x0000000E
ROLE_SYSTEM_DOCUMENT            = 0x0000000F
ROLE_SYSTEM_PANE                = 0x00000010
ROLE_SYSTEM_CHART               = 0x00000011
ROLE_SYSTEM_DIALOG              = 0x00000012
ROLE_SYSTEM_BORDER              = 0x00000013
ROLE_SYSTEM_GROUPING            = 0x00000014
ROLE_SYSTEM_SEPARATOR           = 0x00000015
ROLE_SYSTEM_TOOLBAR             = 0x00000016
ROLE_SYSTEM_STATUSBAR           = 0x00000017
ROLE_SYSTEM_TABLE               = 0x00000018
ROLE_SYSTEM_COLUMNHEADER        = 0x00000019
ROLE_SYSTEM_ROWHEADER           = 0x0000001A
ROLE_SYSTEM_COLUMN              = 0x0000001B
ROLE_SYSTEM_ROW                 = 0x0000001C
ROLE_SYSTEM_CELL                = 0x0000001D
ROLE_SYSTEM_LINK                = 0x0000001E
ROLE_SYSTEM_HELPBALLOON         = 0x0000001F
ROLE_SYSTEM_CHARACTER           = 0x00000020
ROLE_SYSTEM_LIST                = 0x00000021
ROLE_SYSTEM_LISTITEM            = 0x00000022
ROLE_SYSTEM_OUTLINE             = 0x00000023
ROLE_SYSTEM_OUTLINEITEM         = 0x00000024
ROLE_SYSTEM_PAGETAB             = 0x00000025
ROLE_SYSTEM_PROPERTYPAGE        = 0x00000026
ROLE_SYSTEM_INDICATOR           = 0x00000027
ROLE_SYSTEM_GRAPHIC             = 0x00000028
ROLE_SYSTEM_STATICTEXT          = 0x00000029
ROLE_SYSTEM_TEXT                = 0x0000002A
ROLE_SYSTEM_PUSHBUTTON          = 0x0000002B
ROLE_SYSTEM_CHECKBUTTON         = 0x0000002C
ROLE_SYSTEM_RADIOBUTTON         = 0x0000002D
ROLE_SYSTEM_COMBOBOX            = 0x0000002E
ROLE_SYSTEM_DROPLIST            = 0x0000002F
ROLE_SYSTEM_PROGRESSBAR         = 0x00000030
ROLE_SYSTEM_DIAL                = 0x00000031
ROLE_SYSTEM_HOTKEYFIELD         = 0x00000032
ROLE_SYSTEM_SLIDER              = 0x00000033
ROLE_SYSTEM_SPINBUTTON          = 0x00000034
ROLE_SYSTEM_DIAGRAM             = 0x00000035
ROLE_SYSTEM_ANIMATION           = 0x00000036
ROLE_SYSTEM_EQUATION            = 0x00000037
ROLE_SYSTEM_BUTTONDROPDOWN      = 0x00000038
ROLE_SYSTEM_BUTTONMENU          = 0x00000039
ROLE_SYSTEM_BUTTONDROPDOWNGRID  = 0x0000003A
ROLE_SYSTEM_WHITESPACE          = 0x0000003B
ROLE_SYSTEM_PAGETABLIST         = 0x0000003C
ROLE_SYSTEM_CLOCK               = 0x0000003D

описание ролей


Этот скрипт будет проверять в этом меню:
http://i.imgur.com/tlM4NPE.png
По нажатию левой кнопки мыши он его не выполнит, а скажет что это в tooltip.(что бы он открывался надо к LButton добавить ~)


п.с вот сайт acc


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

+ открыть спойлер
Global Hwnd_menu

#if Acc_ObjectFromPoint(c).AccRole(c) = 33
    ~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
}    

45 (изменено: Доктор ТуамОсес, 2015-07-04 18:54:58)

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

yalanne
Огромное спасибо.
Буду изучать.

To ALL
Эта тема про инструменты разработки AHK-скриптов

Поэтому такой вопрос.

Посоветуйте ХОРОШИЙ И УДОБНЫЙ текстовый макропроцессор (не уверен, что программа именно так называется, но я надеюсь Вы поймете о чем речь), с помощью которого можно было вместо длинючих идентификаторов типа oleacc\AccessibleObjectFromPoint писать свои, чтобы скрипт был написан в более "человеческом виде".

Например вместо вырвиглазного "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)
" написать  "фигня_А".

А после написания кода на таком вот своем языке (почти что "фене") запустить этот макропроцессор и он мне все мои макросы и описания макроподстановок развернет в код на AHK.

Нужен именно отдельный текстовый макропроцессор, а не приблуда, входящая в состав каких-то сред типа Microsoft Visual Studio и т.п.

46 (изменено: yalanne, 2015-07-04 21:00:23)

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

Доктор ТуамОсес, Закоментил код, надеюсь так понятнее.

47

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

yalanne
Спасибо огромное за Ваш труд и за Вашу помощь.
Он будет полезен не только мне но и будущим посетителям данной темы

48

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

Народ! А насчет макропроцессора нашёл из продвинутых только GNU m4


Вы если знаете что-то про другие - постите сюда

49

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

Участник Доктор ТуамОсес на неделю отправляется думать о правилах расстановки точек в конце предложений.

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

50

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

yalanne пишет:

Сойдёт?

У меня этот код не работает. Запускаю, в блокноте нажимаю правую кнопку, появляется меню, нажимаю пункт «Вставить» — происходит просто вставка из буфера обмена. Windows 7 64 AHK 64.

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