(AHK) Если инструкция с GetKeyState не работает?

Итак, я пытаюсь создать скрипт, который будет прокручивать влево и вправо, удерживая среднюю кнопку мыши. Однако прокрутка влево и вправо прокручивается независимо от того, удерживается ли нажатой средняя кнопка мыши. Он всегда выполняется. Мне нужна помощь, чтобы попытаться понять это.

(Я заметил, что в строке 21 слишком много места, не обращайте на это внимания) Код:

; Hold the scroll wheel and scroll to scroll horizontally
; Scroll up = left, scroll down = right

#NoEnv
;#InstallMouseHook

#HotkeyInterval 1
#MaxHotkeysPerInterval 1000000 ; Prevents the popup when scrolling too fast

GetKeyState, ScrollState, MButton

if(ScrollState = U)
{
        ;return
}
else if(ScrollState = D)
{
        WheelUp::Send {WheelLeft}
        return

        WheelDown::     Send {WheelRight}
        return
}
return

person Elliot    schedule 28.04.2013    source источник


Ответы (2)


Этот метод сохраняет все обычные функции среднего щелчка, но просто переключает переменную state при нажатии. Затем эта переменная проверяется всякий раз, когда используется Wheelup или Wheeldown.

~Mbutton::
    state := 1
Return

~Mbutton up::
    state := 0
Return

WheelUp:: Send % (state) ? "{WheelLeft}" : "{WheelUp}"
WheelDown:: Send % (state) ? "{WheelRight}" : "{WheelDown}"

/*
The ternary operators are short for:
If state = 1
    Send {WheelLeft}
else
    Send {WheelUp}
*/
person Elliot DeNolf    schedule 28.04.2013
comment
Спасибо за это. Если бы вы могли объяснить, что означают последние две строки (особенно со знаками % и ?), было бы неплохо. - person Elliot; 29.04.2013
comment
Он использует так называемый тернарный оператор, сокращенно if/then/else. Итак, для Wheelup: если state = 1, то отправьте результат {WheelLeft}, иначе отправьте {WheelUp}. Я добавил к своему ответу для ясности. - person Elliot DeNolf; 29.04.2013

Горячие клавиши, обозначенные двойным двоеточием, не контролируются обычными операторами if. Чтобы сделать горячие клавиши контекстно-зависимыми, необходимо использовать #If (или #IfWinActive, или #IfWinExist). Пример из документации (раздел Контекстно-зависимые горячие клавиши):

#If MouseIsOver("ahk_class Shell_TrayWnd")
WheelUp::Send {Volume_Up}     ; Wheel over taskbar: increase/decrease volume.
WheelDown::Send {Volume_Down} ; 

Вы также можете поместить обычную логику if внутри горячей клавиши (вот пример из раздела Советы и замечания по горячим клавишам):

Joy2::
if not GetKeyState("Control")  ; Neither the left nor right Control key is down.
    return  ; i.e. Do nothing.
MsgBox You pressed the first joystick's second button while holding down the Control key.
return

Контекстная чувствительность через #If предназначена для управления тем, в каком приложении активна ваша горячая клавиша. Обычная логика if внутри определения горячей клавиши предназначена для произвольных условий. То, что вы пытаетесь сделать, соответствует последнему.

Во многих случаях полезно сделать и то, и другое. Если вы хотите, чтобы ваше поведение влево/вправо действовало только в браузере, но не в Microsoft Word, например, вы должны использовать #If, чтобы ограничить действие горячих клавиш браузером, а затем if GetKeyState(...) внутри определения горячих клавиш, чтобы проверить, нажата ли кнопка прокрутки.

person John Y    schedule 28.04.2013