Autohotkey: отправлять щелчок мышью (или нажатие клавиши) без запуска обработчика

У меня есть сценарий AutoHotkey, в котором левая кнопка мыши сопоставлена ​​с функцией. Часть функции включает моделирование смещения щелчка левой кнопкой мыши от фактического положения курсора. Неудивительно, что это превращается в бесконечный цикл.

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

Есть ли способ выполнить щелчок без запуска обработчика щелчка? Точно так же есть способ отправить нажатие клавиши без запуска обработчика нажатия клавиш?


Trap() {
  MouseGetPos, x,y
  ;Perform some math with x and y
  Click %x% %y% left ;oops, this causes Trap to get called again
}

LButton:: Trap

person Synetech    schedule 25.02.2012    source источник
comment
Похоже, что какой-то озлобленный человек почему-то голосует за месть.   -  person Synetech    schedule 29.03.2012


Ответы (2)


Из руководства AutoHotkey:

$ - Обычно это необходимо только в том случае, если сценарий использует команду «Отправить» для отправки ключей, составляющих саму горячую клавишу, что в противном случае могло бы вызвать ее срабатывание.

Вот и трюк:

$LButton:: Trap
person Synetech    schedule 25.02.2012

На самом деле я не вижу описываемого вами поведения зацикливания, поэтому мне интересно, есть ли здесь какой-то другой фактор.

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

isTrapping := false

Trap() {
    global isTrapping

    if isTrapping = true
        return

    isTrapping := true

    MouseGetPos x, y
    ; do some maths with x & y

    Click %x%, %y%

    isTrapping := false
}

LButton::Trap()
person Jay    schedule 25.02.2012
comment
Хм, ты прав. Я, должно быть, слишком упростил пример. Кажется, сейчас он работает, но единственное, что я изменил, - это поменять y на %y% (когда я меняю его обратно, он не волнуется, как было). Надеюсь, он продолжит вести себя, пока не закончит… - person Synetech; 25.02.2012