Вы должны войти, чтобы создавать сообщения и темы.

Как с помощью AHKv2 взаимодействовать с ярлыками на начальном экране (в меню пуск)?

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

Вся сложность в том, что эти ярлыки программ - это не обычные контролы, и потому в отличие от большиства объектов UI программ или ОС они не распознаются через Window Spy. Также нигде в винде нет папки, в которой эти ярлыки могли бы находиться. 

Подскажите, пожалуйста, если кто знает - как добавить или удалить ярлыки на начальный экран в меню Пуск, не взаимодействуя напрямую с самим меню Пуск? Возможно ли это? Где-то же должен сохраняться перечень того, что было туда добавлено. Пробовал искать на виртуалке, делая снимки диска и реестра, но не нашел ничего, что могло бы приблизить меня к ответу. Заранее спасибо!

Илья, Привет.

Вся сложность в том, что эти ярлыки программ - это не обычные контролы, и потому в отличие от большиства объектов UI программ или ОС они не распознаются через Window Spy. Также нигде в винде нет папки, в которой эти ярлыки могли бы находиться. 

Поэтому до сих пор и нет такой программы, раньше была, еще на win 7 вроде, теперь нет с переработкой ядра и windows в целом, стало проблематично такое сделать(если я правильно понял про что ты).

«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн

Mikhail, приветствую!
Я про другое. Для надежной автоматизации нужно по минимуму взаимодействовать с самим UI, и заменять это взаимодействие на прямые команды везде где это возможно. Например, ко всем (или почти всем) элементам Панели управления можно перейти с помощью утилиты "Выполнить" (открывается по Win+R), просто введя нужную команду. Или, например, для помещения ярлыка на Рабочий стол достаточно создать его в папке с соответствующим названием. 

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

Даже без этого знания автоматизировать меню Пуск все равно возможно с помощью прямой эмуляции действий пользователя - клики, перемещение мышки и т.п. - но это слишком по колхозному и ненадежно.

Изменения в меню Пуск не могут нигде не отражаться - они должны записываться на диск в каком-то виде

Как найдёшь, скажешь)

«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн

Mikhail, Привет)

В общем, фиг знает как этим Пуском можно корректно управлять)) Ни UI Automation, ни Acc его не видят. Пока придумал только управление с помощью эмуляции нажатия клавиш Win, Tab, AppsKey и Enter. Таким способом можно очистить начальный экран от всего барахла, которое там есть по умолчанию, а затем добавить туда все нужные приложения в нужной последовательности. Это достаточно надежный вариант.

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

Mikhail, ещё раз привет)

Если тема еще интересна, то я нашел ответ на свой вопрос)

Библиотека UIAutomation для AHKv2. Напрямую (так, как это обычно делается для элементов стандартных окон) взаимодействовать с меню Пуск через нее не получалось. Но если указать на нужный элемент с помощью ElementFromPoint, то UIA как-то ухитрялся его найти.
Начал искать альтернативное решение, т.к. очевидно что ElementFromPoint годится только для окон, которые не могут менять свой размер. И наконец чат ГПТ подсказал рабочий вариант:
Первое что нужно сделать - получить корневой элемент всего UI. Выполняя поиск в его дочерних элементах можно гарантированно найти любой элемент в системе. Этим корневым элементом является Desktop, и получается он следующим образом:

СкопированоhDesktop := DllCall("GetDesktopWindow", "Ptr") ; Возвращает хендл рабочего стола
Скопированоdesktop := UIA.ElementFromHandle(hDesktop) ; Находит элемент по его идентификатору (хендл)
Далее останется только выполнить стандартный поиск в дочерних элементах этого объекта с помощью AutomationID или ClassNN:

Скопированоwindow := desktop.FindElement({AutomationId:"tile-W~{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\cmd.exe"}) ; Этот код указывает на элемент "Командная строка" на начальном экране (если он там есть)
Пользуйтесь)
Лайкнули Mikhail и Psydiant
MikhailPsydiant

Илья, Привет.
Интересно, потом попробую, спасибо.

Лайкнул Илья
Илья
«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн