1 (изменено: NektoN95, 2014-11-07 10:57:51)

Тема: AHK: Подсчет длительности нажатия на кнопку

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

#SingleInstance
SetBatchLines, -1
gui, +resize
gui, show, w500 h700

sleep 400
Loop
{
click_hunter("lbutton,rbutton,mbutton", "key_event")
msgbox, %key_event_err% - %key_event_posX% - %key_event_posY% - %key_event_keys%
}
return


;click_hunter ожидает нажатие и отпускание одной или нескольких кнопок (arrayCH), 
;возвращает тип нажатия (%var_nameCH%_err)(несколько кнопок одновременно, нажатие со смещением, их комбинацию или обычный клик). 
;Также возвращает координаты (%var_nameCH%_posX, %var_nameCH%_posY) курсора в момент нажатия, а если курсор был смещен, 
;то и в момент отпускания. Кроме того, возвращает имя сработавший кнопки или кнопок (%var_nameCH%_keys).

click_hunter(arrayCH, var_nameCH)
{
    global
    event_hunter(arrayCH, "D", "mouse_press")
    StringLeft, proove, mouse_press_state, 15
    if (proove = "toomanycontrols")
    {
        %var_nameCH%_err := mouse_press_state
        %var_nameCH%_posX := % mouse_press_posX 
        %var_nameCH%_posY := % mouse_press_posY
    }
    
    event_hunter(mouse_press_keys, "U", "mouse_unpress")
    if (mouse_press_posX != mouse_unpress_posX and mouse_press_posY != mouse_unpress_posY) = 1
    {
        if (proove = "toomanycontrols")
        {
            %var_nameCH%_err := % "cursoroffset," %var_nameCH%_err 
            %var_nameCH%_posX := % %var_nameCH%_posX "," mouse_unpress_posX
            %var_nameCH%_posY := % %var_nameCH%_posY "," mouse_unpress_posY
        }
        else
        {
            %var_nameCH%_err := "cursoroffset"
            %var_nameCH%_posX := % mouse_press_posX "," mouse_unpress_posX
            %var_nameCH%_posY := % mouse_press_posY "," mouse_unpress_posY
        }
    }
    if (mouse_press_posX = mouse_unpress_posX and mouse_press_posY = mouse_unpress_posY and proove != "toomanycontrols") = 1
    {
        %var_nameCH%_err := "normal"
        %var_nameCH%_posX := mouse_press_posX
        %var_nameCH%_posY := mouse_press_posY
    }
    %var_nameCH%_keys := mouse_press_keys
}

;event_hunter Ожидает перехода одного из контролов (Array) 
;в заданное состояние (state_type) и возвращает координаты курсора на момент события (%var_name%_posX, %var_name%_posY)
;и имя сработавший кнопки или кнопок (%var_name%_keys). Также, если сработали две кнопки одновременно,
;переменная %var_name%_state принимает значение "toomanycontrols", иначе - "normal"

event_hunter(Array, state_type, var_name)
{
    global
    local control_amount
    Loop
    {
        Loop, parse, Array, `,;Разбор массива для проверки
        {
            GetKeyState, state_%A_index%, %A_LoopField%
            if state_%A_index% = %state_type%
                {
                control_amount += 1
                if control_amount > 1
                returned := % returned "," A_LoopField 
                else
                returned := A_LoopField
                }
        }
            if control_amount > 1
                {
                %var_name%_state := "toomanycontrols"
                %var_name%_keys := returned
                }
            else if control_amount = 1
                {
                %var_name%_keys := returned
                %var_name%_state := "normal"
                }
            else
                %var_name%_state := "false"
            MouseGetPos, posX, posY
            %var_name%_posX := posX
            %var_name%_posY := posY
            if (%var_name%_state != "false")
                break
            else
            {
                sleep 1
                continue
            }
    }
}
guiclose:
exitapp
return

Нужно каким-то образом отследить время нажатия на кнопку (разумеется, не мешая исполнению уже имеющимся командам скрипта).  Есть у кого нибудь идеи, как это сделать?

2

Re: AHK: Подсчет длительности нажатия на кнопку

Эээ, наверное непонятно выразился, имеется в виду длительность нажатия.

3

Re: AHK: Подсчет длительности нажатия на кнопку

Например, так:

#SingleInstance
SetBatchLines, -1
gui, +resize
gui, show, w500 h700

sleep 400
click_hunter("lbutton,rbutton,mbutton", "key_event")
msgbox, %key_event_err% - %key_event_posX% - %key_event_posY% - %key_event_keys% - %key_event_period%
return


;click_hunter ожидает нажатие и отпускание одной или нескольких кнопок (arrayCH), 
;возвращает тип нажатия (%var_nameCH%_err)(несколько кнопок одновременно, нажатие со смещением, их комбинацию или обычный клик). 
;Также возвращает координаты (%var_nameCH%_posX, %var_nameCH%_posY) курсора в момент нажатия, а если курсор был смещен, 
;то и в момент отпускания. Кроме того, возвращает имя сработавший кнопки или кнопок (%var_nameCH%_keys).

click_hunter(arrayCH, var_nameCH)
{
    global
    event_hunter(arrayCH, "D", "mouse_press")
    %var_nameCH%_period := -A_TickCount 
    StringLeft, proove, mouse_press_state, 15
    if (proove = "toomanycontrols")
    {
        %var_nameCH%_err := mouse_press_state
        %var_nameCH%_posX := % mouse_press_posX 
        %var_nameCH%_posY := % mouse_press_posY
    }
    
    event_hunter(mouse_press_keys, "U", "mouse_unpress")
    %var_nameCH%_period += A_TickCount
    if (mouse_press_posX != mouse_unpress_posX and mouse_press_posY != mouse_unpress_posY) = 1
    {
        if (proove = "toomanycontrols")
        {
            %var_nameCH%_err := % "cursoroffset," %var_nameCH%_err 
            %var_nameCH%_posX := % %var_nameCH%_posX "," mouse_unpress_posX
            %var_nameCH%_posY := % %var_nameCH%_posY "," mouse_unpress_posY
        }
        else
        {
            %var_nameCH%_err := "cursoroffset"
            %var_nameCH%_posX := % mouse_press_posX "," mouse_unpress_posX
            %var_nameCH%_posY := % mouse_press_posY "," mouse_unpress_posY
        }
    }
    if (mouse_press_posX = mouse_unpress_posX and mouse_press_posY = mouse_unpress_posY and proove != "toomanycontrols") = 1
    {
        %var_nameCH%_err := "normal"
        %var_nameCH%_posX := mouse_press_posX
        %var_nameCH%_posY := mouse_press_posY
    }
    %var_nameCH%_keys := mouse_press_keys
}

;event_hunter Ожидает перехода одного из контролов (Array) 
;в заданное состояние (state_type) и возвращает координаты курсора на момент события (%var_name%_posX, %var_name%_posY)
;и имя сработавший кнопки или кнопок (%var_name%_keys). Также, если сработали две кнопки одновременно,
;переменная %var_name%_state принимает значение "toomanycontrols", иначе - "normal"

event_hunter(Array, state_type, var_name)
{
    global
    local control_amount
    Loop
    {
        Loop, parse, Array, `,;Разбор массива для проверки
        {
            GetKeyState, state_%A_index%, %A_LoopField%
            if state_%A_index% = %state_type%
                {
                control_amount += 1
                if control_amount > 1
                returned := % returned "," A_LoopField 
                else
                returned := A_LoopField
                }
        }
            if control_amount > 1
                {
                %var_name%_state := "toomanycontrols"
                %var_name%_keys := returned
                }
            else if control_amount = 1
                {
                %var_name%_keys := returned
                %var_name%_state := "normal"
                }
            else
                %var_name%_state := "false"
            MouseGetPos, posX, posY
            %var_name%_posX := posX
            %var_name%_posY := posY
            if (%var_name%_state != "false")
                break
            else
            {
                sleep 1
                continue
            }
    }
}
guiclose:
exitapp
return

4 (изменено: NektoN95, 2014-11-07 11:55:53)

Re: AHK: Подсчет длительности нажатия на кнопку

Спасибо, отлично работает. А можно узнать принцип, по которому вычисляется задержка? Погуглил,  но в своих выводах не уверен. Поправьте если я не прав: A_TickCount это время, в течении которого работает система, соответственно задержка между нажатиями вычисляется как разница A_TickCount в момент нажатия и в момент отпускания, так?

5

Re: AHK: Подсчет длительности нажатия на кнопку

Пожалуйста. Выводы сделаны верные. )