1

Тема: AHK: Как узнать есть ли в меню определенный пункт

Каким способом можно узнать есть ли определенный пункт в меню. В интернете не нашел как это проверять.

2

Re: AHK: Как узнать есть ли в меню определенный пункт

Меню всякие разные бывают.

3

Re: AHK: Как узнать есть ли в меню определенный пункт

Контекстное меню. где пункты командой

Menu, MyMenu, Add, %text%, menu_goto

добавляются.

4

Re: AHK: Как узнать есть ли в меню определенный пункт

Можно делать что-то с этим меню, И проверять ErrorLevel.
Если ошибки нету, то совершать обратное действие.

5

Re: AHK: Как узнать есть ли в меню определенный пункт

А зачем узнавать о наличии пунктов в меню, которое сам же создал? Они там что, самопроизвольно меняются?

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

6 (изменено: yalanne, 2015-05-04 15:04:50)

Re: AHK: Как узнать есть ли в меню определенный пункт

Есть Edit-box у одной программы. К этому боксу я приделал свою кнопку.

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

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

Работает SetTimer каждые 10мс.Там сначала проверяется активно ли нужное окно,если да то мой gui становится видимым, иначе скрывается.Работает одноразово, то есть не будет постоянно флудить при каждом цикле таймера о появлении этого gui если окно активно, так же и на оборот не будет флудить о скрытии gui если окно не активно.

+ Работает это так

До старта таймера, переменной h присваивается значение 1

if winactive("ahk_exe Octopus.Apex.exe") and (h=2) and (h:=1)
    {
        gui Button_focus_oct:show, NA
        WinSet, Transcolor, 000111, ahk_id %GuiHwnd_Button_focus_oct%
    }
else if !winactive("ahk_exe Octopus.Apex.exe")
    {
        if (h=1) and (h:=2)
            gui Button_focus_oct:hide
    return
    }

После того как окно активно, проверяется на каком элементе фокус ввода. У этого элемента получаю его позицию(относительно окна). Эту позицию складываю с шириной этого элемента и позиции окна и минус ширина кнопки.
ответом этих действий будет позиция gui окна.

X_Button_Gui := X_focus + X_oct + W_focus - 20
Y_Button_Gui := Y_focus + Y_oct - 8

Дальше сравнивается старая позиция с новой(если старой позиции нет то это пропускается)
если старая позиция при новом цикле равна новой, значит изменений нет - конец цикла.

if (X_Button_Gui=Old_X_Button_Gui) or (Y_Button_Gui=Old_Y_Button_Gui)
return

Если есть новая позиция то gui окно на него переместится.
после перемещения задается старая позиция в переменную.

winmove, ahk_id %GuiHwnd_Button_focus_oct%,,%X_Button_Gui%,%Y_Button_Gui%
Old_X_Button_Gui := X_Button_Gui,Old_Y_Button_Gui := Y_Button_Gui

По нажатию левой кнопки мыши открывается контекстное меню(по умолчанию пустое). По сути это меню как быстрый доступ к тексту который часто повторяется.

А по правой кнопке мыши добавляется в меню то что написано в edit-box'е. Пытался реализовать проверку есть ли там уже этот пункт что бы не  создавало клон, а сказало что уже есть и предложило бы удалить.

7

Re: AHK: Как узнать есть ли в меню определенный пункт

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

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

8 (изменено: yalanne, 2015-05-04 17:19:36)

Re: AHK: Как узнать есть ли в меню определенный пункт

Вот так получилось:

list := {}

#if Get_Button_Gui()
Rbutton::
text := focus_text(focus_dinam())
if !text
return
For index, value in list
    if (value = text)
        {    
            list.Delete(index)
            Recreate_menu()
            tooltip % "Удалено - " text
            return
        }

list.Insert(text)
Recreate_menu()
tooltip % "Добавлено - " text
return
Mbutton::return
Lbutton::
Menu, MyMenu, Show 
return
#if

Recreate_menu(){
menu, MyMenu, DeleteAll
Menu, MyMenu, Add,
For index, value in list
Menu, MyMenu, Add, %value%, menu_goto
}


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

9

Re: AHK: Как узнать есть ли в меню определенный пункт

Зачем массив, когда есть еггоrlevel?

10

Re: AHK: Как узнать есть ли в меню определенный пункт

А о чём он говорит?

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

11

Re: AHK: Как узнать есть ли в меню определенный пункт

О том что меню не может быть создано.

12

Re: AHK: Как узнать есть ли в меню определенный пункт

Это где написано такое?

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

13

Re: AHK: Как узнать есть ли в меню определенный пункт

В хелпе по автохотки. Errorlevel принимает значение единицы если действие не удалось. Поэтому в данном случае если меню создать не удастся он выдаст единицу.

14

Re: AHK: Как узнать есть ли в меню определенный пункт

А пример?

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

15

Re: AHK: Как узнать есть ли в меню определенный пункт

Как я понял вот так:

Menu, MyMenu, UseErrorLevel
menu, MyMenu, delete, текст
if errorlevel
    {
        msgbox Не найдено пункта.
        return
    }

ну да так проще.

16

Re: AHK: Как узнать есть ли в меню определенный пункт

Menu, MyMenu, UseErrorLevel
menu, MyMenu, Add, текст
menu, MyMenu, delete, текст
if errorlevel
    {
        msgbox Не найдено пункта.
        return
    }

Проще поймать "неотлавливаемую" ошибку.

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

17

Re: AHK: Как узнать есть ли в меню определенный пункт

А пример?

Menu, MyMenu, UseErrorLevel
menu, MyMenu, Rename, текст, текст
if !ErrorLevel
   msgbox, меню существует
menu, MyMenu, Add, текст, MenuHandler
Menu, MyMenu, Show
return

MenuHandler:
return

18

Re: AHK: Как узнать есть ли в меню определенный пункт

Теоретически так можно, но

Menu, MyMenu, UseErrorLevel
menu, MyMenu, Add, текст, MenuHandler
menu, MyMеnu, Rename, текст, текст
if !ErrorLevel
   msgbox, меню существует
Menu, MyMenu, Show
return

MenuHandler:
return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19

Re: AHK: Как узнать есть ли в меню определенный пункт

А зачем в 3 строке слово "MyMеnu" написано с использованием и кириллицы и латиницы?

20

Re: AHK: Как узнать есть ли в меню определенный пункт

А разве это запрещено? Я просто хотел проиллюстрировать, что таким образом использовать ErrorLevel не совсем надёжно. Он просто говорит о том, что была проблема, но не говорит, какая именно. Генерацию ошибок можно делать в целях дебаггинга, но нехорошо для изменения потока выполнения программы.

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

21

Re: AHK: Как узнать есть ли в меню определенный пункт

Генерацию ошибок можно делать в целях дебаггинга, но нехорошо для изменения потока выполнения программы.

Ты имеешь в виду в данном конкретном случае (из-за того, что ErrorLevel не указывает напрямую, то что пункт меню такой существует) или вообще?

22

Re: AHK: Как узнать есть ли в меню определенный пункт

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

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

23

Re: AHK: Как узнать есть ли в меню определенный пункт

по-моему, грубый, некрасивый, да и ненадёжный подход.

Вот подсознательно - согласен с тобой, а почему согласен - не пойму.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK: Как узнать есть ли в меню определенный пункт

Так это как раз понятно - у каждой команды свое назначение, а тут они производят ненужные действия лишь с целью посмотреть результат ошибки. Все равно, что пытаться форматировать диск Х, чтобы узнать, не системный ли он. (Хотя и не с такими печальными последствиями).

25 (изменено: Malcev, 2015-05-06 15:18:55)

Re: AHK: Как узнать есть ли в меню определенный пункт

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

Согласен со всем кроме ненадежности. Пример можно, помимо специального изменения названия?

Так это как раз понятно - у каждой команды свое назначение, а тут они производят ненужные действия лишь с целью посмотреть результат ошибки. Все равно, что пытаться форматировать диск Х, чтобы узнать, не системный ли он. (Хотя и не с такими печальными последствиями).

Для узнавния системного диска есть специальная комманда. А тут ее нету. Например, если есть необходимость узнать есть ли пункт меню уже у готового меню, то легче сделать таким маневром через ж.., чем вникать в дебри dllcall.
Chris, администратор офф. форума написал такой же вариант:
http://www.autohotkey.com/board/topic/1 … u-x-exist/

26

Re: AHK: Как узнать есть ли в меню определенный пункт

Malcev пишет:

Пример можно, помимо специального изменения названия?

Например, случайное изменение названия. Или любая другая ошибка.

Chris, администратор офф. форума написал такой же вариант

Ну я ж говорю, это по большому счёту, т. е. если бы ты работал программистом, подобное сочли бы «говнокодом». Может, разработчикам Microsoft поверишь больше, чем мне:

Чего следует избегать при генерации исключений
  • Исключения не рекомендуется использовать для изменения потока программы в рамках обычного выполнения. Исключения используются только для сообщения о состояниях ошибки и их обработки.

Ну, а для «бытовых» целей сойдёт.

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