Тема: AHK: Как узнать есть ли в меню определенный пункт
Каким способом можно узнать есть ли определенный пункт в меню. В интернете не нашел как это проверять.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Каким способом можно узнать есть ли определенный пункт в меню. В интернете не нашел как это проверять.
Меню всякие разные бывают.
Можно делать что-то с этим меню, И проверять ErrorLevel.
Если ошибки нету, то совершать обратное действие.
А зачем узнавать о наличии пунктов в меню, которое сам же создал? Они там что, самопроизвольно меняются?
Есть 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'е. Пытался реализовать проверку есть ли там уже этот пункт что бы не создавало клон, а сказало что уже есть и предложило бы удалить.
Ну просто параллельно с добавлением в меню сохраняйте новый текст в массив, потом проверяйте на существующее значение в массиве.
Вот так получилось:
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 странно себя ведет, подсказку иногда показывает в самом верху экрана.
Зачем массив, когда есть еггоrlevel?
А о чём он говорит?
О том что меню не может быть создано.
Это где написано такое?
В хелпе по автохотки. Errorlevel принимает значение единицы если действие не удалось. Поэтому в данном случае если меню создать не удастся он выдаст единицу.
А пример?
Как я понял вот так:
Menu, MyMenu, UseErrorLevel
menu, MyMenu, delete, текст
if errorlevel
{
msgbox Не найдено пункта.
return
}
ну да так проще.
Menu, MyMenu, UseErrorLevel
menu, MyMenu, Add, текст
menu, MyMenu, delete, текст
if errorlevel
{
msgbox Не найдено пункта.
return
}
Проще поймать "неотлавливаемую" ошибку.
А пример?
Menu, MyMenu, UseErrorLevel
menu, MyMenu, Rename, текст, текст
if !ErrorLevel
msgbox, меню существует
menu, MyMenu, Add, текст, MenuHandler
Menu, MyMenu, Show
return
MenuHandler:
return
Теоретически так можно, но
Menu, MyMenu, UseErrorLevel
menu, MyMenu, Add, текст, MenuHandler
menu, MyMеnu, Rename, текст, текст
if !ErrorLevel
msgbox, меню существует
Menu, MyMenu, Show
return
MenuHandler:
return
А зачем в 3 строке слово "MyMеnu" написано с использованием и кириллицы и латиницы?
А разве это запрещено? Я просто хотел проиллюстрировать, что таким образом использовать ErrorLevel не совсем надёжно. Он просто говорит о том, что была проблема, но не говорит, какая именно. Генерацию ошибок можно делать в целях дебаггинга, но нехорошо для изменения потока выполнения программы.
Генерацию ошибок можно делать в целях дебаггинга, но нехорошо для изменения потока выполнения программы.
Ты имеешь в виду в данном конкретном случае (из-за того, что ErrorLevel не указывает напрямую, то что пункт меню такой существует) или вообще?
Вообще это, по-моему, грубый, некрасивый, да и ненадёжный подход. Но это если говорить по большому счёту.
по-моему, грубый, некрасивый, да и ненадёжный подход.
Вот подсознательно - согласен с тобой, а почему согласен - не пойму.
Так это как раз понятно - у каждой команды свое назначение, а тут они производят ненужные действия лишь с целью посмотреть результат ошибки. Все равно, что пытаться форматировать диск Х, чтобы узнать, не системный ли он. (Хотя и не с такими печальными последствиями).
Вообще это, по-моему, грубый, некрасивый, да и ненадёжный подход. Но это если говорить по большому счёту.
Согласен со всем кроме ненадежности. Пример можно, помимо специального изменения названия?
Так это как раз понятно - у каждой команды свое назначение, а тут они производят ненужные действия лишь с целью посмотреть результат ошибки. Все равно, что пытаться форматировать диск Х, чтобы узнать, не системный ли он. (Хотя и не с такими печальными последствиями).
Для узнавния системного диска есть специальная комманда. А тут ее нету. Например, если есть необходимость узнать есть ли пункт меню уже у готового меню, то легче сделать таким маневром через ж.., чем вникать в дебри dllcall.
Chris, администратор офф. форума написал такой же вариант:
http://www.autohotkey.com/board/topic/1 … u-x-exist/
Пример можно, помимо специального изменения названия?
Например, случайное изменение названия. Или любая другая ошибка.
Chris, администратор офф. форума написал такой же вариант
Ну я ж говорю, это по большому счёту, т. е. если бы ты работал программистом, подобное сочли бы «говнокодом». Может, разработчикам Microsoft поверишь больше, чем мне:
Чего следует избегать при генерации исключений
Исключения не рекомендуется использовать для изменения потока программы в рамках обычного выполнения. Исключения используются только для сообщения о состояниях ошибки и их обработки.
Ну, а для «бытовых» целей сойдёт.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться