1

Тема: AHK : двойной клик и около.

Есть окно,  в котором после двойного  клика в определённых местах производятся некоторые манипуляции.

  Мне хочется перехватить этот двойной клик и выполнить ещё и другие манипуляции.
  Ловить клик по месту, или контроллу не получается - "определённые места" могут менять расположения, а как контролы они не определяются.
  Очевидно двойной клик отправляет окну какое-то сообщение? Как его перехватить? С помощью Windows Detective ничего не получилось.

  Если это невозможно, то как проще всего и быстрее по времени, перехватывать вообще сам по себе двойной клик в окне?
 

Спасибо за помощь!

2 (изменено: creature.ws, 2012-10-29 14:50:29)

Re: AHK : двойной клик и около.

Двойной клик это два последовательных клика с длительностью паузы менее определённого значения.
«Перехватить» двойной клик нельзя, можно заблокировать лишь второй клик из двух.
Если у «этого» клика нет определяемых с помощью ahk признаков, то выявить именно «этот» клик из множества «других» двойных кликов по окну нужной программы не выйдет (очевидно )

MultiClick(numClick, clickTimeout)
{
    static clickCount, priorHotKey, priorTickCount
    b := (clickCount := (A_ThisHotkey == priorHotKey && A_TickCount-priorTickCount <= clickTimeout)? clickCount+1 : 0) = numClick-1
    , priorHotKey := A_ThisHotkey, priorTickCount := A_TickCount
    return b
}

#if WinActive("ahk_class CabinetWClass") && MultiClick(2, 300)
    ~LButton::SoundBeep ; при «двойном клике» в окне проводника раздастся звуковой сигнал.
#if

3 (изменено: Malcev, 2012-10-29 12:18:37)

Re: AHK : двойной клик и около.

Вот красивый вариант

~LButton::
If (A_TimeSincePriorHotkey<400) and (A_TimeSincePriorHotkey<>-1)
MsgBox You double clicked on something
Return

4

Re: AHK : двойной клик и около.

Только проверку добавить, равны ли имена текущей и предыдущей горячей клавиши

5

Re: AHK : двойной клик и около.

Точно!

~LButton::
If (A_TimeSincePriorHotkey<400) and (A_TimeSincePriorHotkey<>-1) and (A_ThisHotkey=A_PriorHotkey)
MsgBox You double clicked on something
Return

6 (изменено: creature.ws, 2012-10-29 13:02:12)

Re: AHK : двойной клик и около.

А вот в таком случае проверка A_TimeSincePriorHotkey <> -1 не требуется, потому как когда A_TimeSincePriorHotkey = -1 — A_ThisHotkey <> A_PriorHotkey.

7

Re: AHK : двойной клик и около.

Железная логика.

~LButton::
If (A_TimeSincePriorHotkey<400) and (A_ThisHotkey=A_PriorHotkey)
MsgBox You double clicked on something
Return

8 (изменено: creature.ws, 2012-10-29 13:36:56)

Re: AHK : двойной клик и около.

А теперь это условие можно завернуть в функцию, назвать её DoubleClick и использовать везде где нужно (за исключением директивы #if)

9

Re: AHK : двойной клик и около.

А можешь, пожалуйста, на этом примере показать?
А то функции до меня слишком тяжело доходят.

DoubleClick(400)
~LButton::MsgBox You double clicked on something
DoubleClick(clickTimeout)
{
    bool := (A_TimeSincePriorHotkey<clickTimeout) and (A_ThisHotkey = A_PriorHotkey)
    return bool
}

10 (изменено: creature.ws, 2012-10-29 19:09:36)

Re: AHK : двойной клик и около.

~LButton::
If DoubleClick(400)
    MsgBox You double clicked on something
Return

DoubleClick(clickTimeout)
{
    return A_TimeSincePriorHotkey<clickTimeout and A_ThisHotkey = A_PriorHotkey
}

Или

#if DoubleClick(400)
    ~LButton::MsgBox You double clicked on something
#if

DoubleClick(clickTimeout)
{
    static doubleClick, priorHotKey, priorTickCount
    doubleClick := (A_ThisHotkey == priorHotKey && !doubleClick && A_TickCount-priorTickCount <= clickTimeout)
    , priorHotKey := A_ThisHotkey, priorTickCount := A_TickCount
    return doubleClick
}

11

Re: AHK : двойной клик и около.

Первый вариант понял, а вот во втором непонятно
1) && !doubleClick - это что такое и зачем?
2) , firstpress - это что такое?

12

Re: AHK : двойной клик и около.

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

Но хоть скажите, как это в код встраивать? По таймеру или в общем потоке повесить?  Если по таймеру, то какое минимальное время ему можно выставить, что не тормозило даже на слабых компах, например нетбуках?

13

Re: AHK : двойной клик и около.

, firstpress - это что такое?

— огрызок первоначального варианта кода.
&& !doubleClick — эта переменная используется и хранится между вызовами для идентификации «пар кликов». Иначе при количестве кликов более 2-х каждый последующий быстрый клик интерпретируется как двойной (с учетом предыдущего)
Pokerist разве пример во втором сообщении содержит таймеры?

14

Re: AHK : двойной клик и около.

Pokerist разве пример во втором сообщении содержит таймеры?

Понял.

А как бы второй клик ещё ограничить по расстоянию от первого? Чтобы это срабатывало именно как настощий двойной клик. Допустим если больше 3-5 пикселей между местами кликов - то не защитывается.

15

Re: AHK : двойной клик и около.

http://www.autohotkey.com/docs/commands/SysGet.htm

36, 37  SM_CXDOUBLECLK, SM_CYDOUBLECLK: Width and height of the rectangle around the location of a first click in a double-click sequence, in pixels. The second click must occur within this rectangle for the system to consider the two clicks a double-click. (The two clicks must also occur within a specified time.)

16

Re: AHK : двойной клик и около.

И ещё одно. Если окно неактивно, то двойной клик в него не засчитывается. Приходится делать "тройной". Можно это как-то побороть?
Речь идёт о коде из сообщения #2.

17

Re: AHK : двойной клик и около.

Malcev пишет:

http://www.autohotkey.com/docs/commands/SysGet.htm

36, 37  SM_CXDOUBLECLK, SM_CYDOUBLECLK: Width and height of the rectangle around the location of a first click in a double-click sequence, in pixels. The second click must occur within this rectangle for the system to consider the two clicks a double-click. (The two clicks must also occur within a specified time.)

Я наверное не точно сформулировал. Я имею ввиду, что при использовании кода из сообщения #2, два быстрых клика на расстоянии в 100 пикселей засчитыватся как даблклик.  Хотелось бы этого избежать.

18

Re: AHK : двойной клик и около.

Определяйте при клике координаты мыши, сравнивайте с ранее сохранёнными координатами предыдущего клика, сохраняйте текущие координаты в качестве «предыдущих».

19

Re: AHK : двойной клик и около.

Это я сумею. Вот в каком месте кода встроить эту проверку - не представляю, поскольку код совершенно не понял.

20

Re: AHK : двойной клик и около.

поскольку код совершенно не понял.

Не верю ©

Можно и развернуть условие.

MultiClick(numClick, clickTimeout)
{
    static clickCount
    static priorHotKey
    static priorTickCount

    if (A_ThisHotkey == priorHotKey && A_TickCount-priorTickCount <= clickTimeout)
        ++clickCount
    else clickCount := 0

    priorHotKey := A_ThisHotkey
    priorTickCount := A_TickCount

    if (clickCount = numClick-1)
        return true
    else return false
}

«Непонятно» не принимается.

21

Re: AHK : двойной клик и около.

~LButton::
If (A_TimeSincePriorHotkey<400) and (A_ThisHotkey=A_PriorHotkey)
{
   MouseGetPos x2, y2
   Msgbox, % Abs(x1 - x2)
   If Abs(x1 - x2) < 5
   Msgbox, You double clicked on something
}
Else
MouseGetPos x1, y1
Return

22

Re: AHK : двойной клик и около.

Malcev пишет:
~LButton::
If (A_TimeSincePriorHotkey<400) and (A_ThisHotkey=A_PriorHotkey)
{
   MouseGetPos x2, y2
   Msgbox, % Abs(x1 - x2)
   If Abs(x1 - x2) < 5
   Msgbox, You double clicked on something
}
Else
MouseGetPos x1, y1
Return

Только пятая строчка наверное так должна выглядеть?


If (Abs(x1 - x2) < 5) and (Abs(y1 - y2) < 5)

23

Re: AHK : двойной клик и около.

Да. Пропустил

24

Re: AHK : двойной клик и около.

creature.ws пишет:

«Непонятно» не принимается.

Разобрался, спасибо! Просто с фукциями, а также такими встроенными переменными и "#if" не имел дела до этого.

Про "#if" вообще ничего нигде нет. Только по аналогии с "#IfWinActive" смог догадаться что тут к чему. Кстати их даже в списке команд http://www.script-coding.com/AutoHotkey … dList.html нет.

25

Re: AHK : двойной клик и около.

Malcev пишет:

Да. Пропустил

Спасибо!

26

Re: AHK : двойной клик и около.

Про "#if" вообще ничего нигде нет.

http://l.autohotkey.net/docs/commands/_If.htm

27 (изменено: Pokerist, 2012-10-30 19:07:59)

Re: AHK : двойной клик и около.

Да, там я его нашёл, но как не силился, как не переводил, не понял почти ничего. 


Что касается скрипта - всё работает прекрасно. Что-то я сегодня не внимательный.