1

Тема: AHK v2: Нестабильность ControlClick

У меня ControlClick часто не срабатывает: кнопка выделяется, но действия по ней не происходит. В результате все ControlClick заменил на

	WinExist("A") ; Set the Last Found Window to the active window
	hWndControl := ControlGetHwnd(Control)  ; Get HWND of Button
	SendMessage 0x0028, hWndControl, True  ; 0x0028 is WM_NEXTDLGCTL
	send '{Enter}'

Это работает.
В чём тут дело? Хотелось бы, конечно, просто кликать.

2

Re: AHK v2: Нестабильность ControlClick

Возможно проблема в таймингах. Попробуй настроить время отклика с SetControlDelay.

Справка пишет:

Reliability

To improve reliability -- especially during times when the user is physically moving the mouse during the ControlClick -- one or both of the following may help:

1) Use SetControlDelay -1 prior to ControlClick. This avoids holding the mouse button down during the click, which in turn reduces interference from the user's physical movement of the mouse.

2) Specify the string NA anywhere in the sixth parameter (Options) as shown below:
SetControlDelay -1
ControlClick, Toolbar321, WinTitle,,,, NA


NA avoids marking the target window as active and avoids merging its input processing with that of the script, which may prevent physical movement of the mouse from interfering (but usually only when the target window is not active). However, this method might not work for all types of windows and controls.

+ Перевод

Надежность

Для повышения надежности — особенно в моменты, когда пользователь физически перемещает мышь во время ControlClick — может помочь один или оба из следующих способов:

1) Используйте SetControlDelay -1 перед ControlClick. Это позволяет избежать удержания кнопки мыши во время щелчка, что, в свою очередь, уменьшает помехи от физического перемещения мыши пользователем.

2) Укажите строку NA в любом месте шестого параметра (Параметры), как показано ниже:
SetControlDelay -1
ControlClick, Toolbar321, WinTitle,,,, NA


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

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

3

Re: AHK v2: Нестабильность ControlClick

Alectric
SetControlDelay я пробовал, не помогло. Вряд ли дело в таймингах, ведь при тех же таймингах одно работает, а другое нет. Другое дело, что у тебя ControlClick работает. Вот это и непонятно.

4

Re: AHK v2: Нестабильность ControlClick

Попробуйте сообщение BM_CLICK вместо ControlClick. Судя по описанию, оно более надёжно.

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

5

Re: AHK v2: Нестабильность ControlClick

Спасибо! Работает, буду пользоваться.

SendMessage(0x00F5,,, '&Найти далее') ; 0x00F5 is BM_CLICK

6 (изменено: haridev, 2026-05-29 16:09:57)

Re: AHK v2: Нестабильность ControlClick

Alectric
Был неправ. Я пробовал SetControlDelay 200, но не пробовал SetControlDelay -1. Думал, раз мышью не двигаю, -1 не мой случай. Однако сейчас проверил с -1, работает.

--
Дополнение.
Оказалось, с -1 работает там, где не работает с BM_CLICK. Буду смотреть.

7

Re: AHK v2: Нестабильность ControlClick

По итогу, рекомендация "Use SetControlDelay -1 prior to ControlClick" оказалась правильной.
PostMessage(0x00F5... также работает стабильно, без SetControlDelay -1.
SendMessage(0x00F5... выдаёт таймаут, когда открывает модальное окно.

8

Re: AHK v2: Нестабильность ControlClick

в autohotkey v2 инструкция controlclick работает неравильно: кнопка выделяется, но действия по ней не происходит. Как и чем обеспечить стабильное нажатие на кнопку в autohotkey?

Ответ gigachat.

Проблема, с которой вы столкнулись, действительно известна для AutoHotkey v2. В ряде случаев ControlClick выделяет кнопку, но не выполняет по ней реальное нажатие. Это связано с тем, как современные приложения обрабатывают сообщения от системы и как именно ControlClick эмулирует действия мыши.

Рекомендации и решения:

Использование SendMessage вместо ControlClick
Вместо ControlClick для гарантированного срабатывания часто используют отправку сообщения непосредственно элементу управления через SendMessage. Это наиболее стабильный способ, который работает даже там, где ControlClick не даёт эффекта. Пример рабочего кода для AHK v2:

WinExist("A") ; Устанавливает последнее найденное окно как активное
hWndControl := ControlGetHwnd("Button3") ; Получаем HWND кнопки (замените на нужный ClassNN или текст)
SendMessage 0x00F5, hWndControl, True ; 0x00F5 = BM_CLICK (нажатие кнопки)
Вместо 0x00F5 можно использовать 0x0028 (WM_NEXTDLGCTL), если нужно передать фокус и нажать Enter, но для кнопок чаще всего нужен именно BM_CLICK. Такой подход стабильно работает в большинстве современных программ.

Параметр NA в ControlClick
Если вы всё же хотите использовать ControlClick, попробуйте добавить параметр NA (NoActivate) в конец команды. Это заставляет скрипт ждать отпускания кнопки мыши, что иногда решает проблему:

ControlClick, Button3, , , , , NA

Этот совет пришёл из AHK v1, но его часто успешно применяют и в v2.

Альтернативные варианты
Tab и Enter: Если интерфейс стандартный, можно передать фокус кнопке с помощью ControlFocus или отправки Tab, а затем нажать Enter.
Прямая активация окна: Перед кликом убедитесь, что окно активно (WinActivate). Некоторые окна игнорируют клики по элементам, если не находятся на переднем плане.
Проверка ClassNN и текста: Убедитесь, что вы используете правильный идентификатор (ClassNN или текст) элемента управления. Для этого используйте утилиту Window Spy, входящую в состав AutoHotkey.
Вывод:
Для стабильного нажатия на кнопку в AutoHotkey v2 рекомендуется использовать метод с ControlGetHwnd и SendMessage, так как он обходит ограничения эмуляции мыши и работает напрямую с API Windows. Если этот способ не подходит по каким-то причинам — попробуйте добавить параметр NA к команде ControlClick или использовать навигацию по Tab + Enter.

9

Re: AHK v2: Нестабильность ControlClick

Что примечательно, gigachat не включил в ответ ни  "Use SetControlDelay -1 prior to ControlClick", ни postmessage. Выходит, он главный форум по autohotkey то ли не читает, то ли не принимает во внимание.

10

Re: AHK v2: Нестабильность ControlClick

Я бы не использовал gigachat. Используйте те нейросети, которые могут посмотреть и оценить исходный код функций.

haridev пишет:

Выходит, он главный форум по autohotkey то ли не читает, то ли не принимает во внимание

Ну, вообще-то, другие нейросети тоже не могут обычно прочитать AHK-форум, там защита Cloudflare от ботов.

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

11

Re: AHK v2: Нестабильность ControlClick

Вот чего насоветовала DeepSeek

Loop 5 {
    try ControlClick "Button1", "Окно"
    catch
        Sleep 100
    else
        break
}

12

Re: AHK v2: Нестабильность ControlClick

Не, DeepSeek в AHK тоже не умеет.

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

13

Re: AHK v2: Нестабильность ControlClick

Так бесплатных вроде нет других.

14

Re: AHK v2: Нестабильность ControlClick

Режим ИИ гугл бесплатный.

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

15

Re: AHK v2: Нестабильность ControlClick

Да, кстати.

Обзор от ИИ гугл

Когда ControlClick выделяет кнопку, но не активирует ее выполнение (срабатывание функции), это связано с тем, что клик проходит мимо скрытых слоев программы.

Вопрос. Почему клик проходит мимо скрытых слоев программы?

Ответ. Причина в том, что ControlClick — это не физическое движение вашей мыши, а программная иллюзия.

Ну и так далее.


Кстати, я так и не понял, почему "SetControlDelay -1" или "NA",  из их описания, помогают.

16

Re: AHK v2: Нестабильность ControlClick

haridev, Grok или Chatgpt советую использовать. Правда напрямую не выйдет.

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

17

Re: AHK v2: Нестабильность ControlClick

Попробовал Chatgpt через агрегатор study24.ai. Токенов не хватило понять, лучше ли он бесплатных ))

18

Re: AHK v2: Нестабильность ControlClick

В общем, картинка у меня сложилась.ControlClick выполняет последовательно 2 действия: кнопка вниз и кнопка вверх с промежутком 20 мс. И-за промежутка некоторые обработчики считают, что полного клика не было.
SetControlDelay(-1) устраняет задержку, и клик становится полным.

19

Re: AHK v2: Нестабильность ControlClick

В общем, лучше вместо SetControlDelay(-1), ControlClick пользовать PostMessage(0x00F5... , так как без задержки другие команды в других случаях не работают. У меня перестала работать ControlChooseIndex.

20 (изменено: haridev, 2026-07-11 16:47:48)

Re: AHK v2: Нестабильность ControlClick

del