Мне нужна помощь со скриптом, я хочу, чтобы он работал только тогда, когда я держу нажатой клавишу. Вот сценарий:

;If you use this, you have to use absolute screen coordinates.
CoordMode, Mouse, Screen

;Suppose a 100x100 px bounding box for your game inventory.
;Eg., from (500, 500) to (600, 600)
w::
{
    ;Get current Mouse coords
    MouseGetPos, xCurrent ,yCurrent

    ;Calculate future Mouse coords
    xMoved := xCurrent
    yMoved := yCurrent - 35

    ;Check if the future mouse postion will be
    ;below the top border of your bounding box, 
    ;aka still inside it, after it has moved.
    ;If so, proceed and move the mouse,
    ;otherwise do nothing.
MouseGetPos, CoordXRec, CoordYRec
        MouseMove, xMoved, yMoved


if(yMoved < 503 && yMoved > 350 && yMoved > 360){
MouseMove 1846, 166
}
if(yMoved < 145){
MouseMove, %CoordXRec%, %CoordYRec%, 0
}
if(yMoved < 718 && yMoved < 720 && yMoved > 680){
MouseMove 1771, 671
}
return  
}
s::
{
    ;Get current Mouse coords
    MouseGetPos, xCurrent ,yCurrent

    ;Calculate future Mouse coords
    xMoved := xCurrent
    yMoved := yCurrent +35

    ;Check if the future mouse postion will be
    ;below the top border of your bounding box, 
    ;aka still inside it, after it has moved.
    ;If so, proceed and move the mouse,
    ;otherwise do nothing.

        MouseMove, xMoved, yMoved

if(yMoved > 285 && yMoved < 360){
MouseMove 1773, 526
}
if(yMoved > 697 && yMoved < 715){
MouseMove 1772, 736
}
return
}
a::
{
    ;Get current Mouse coords
    MouseGetPos, xCurrent ,yCurrent

    ;Calculate future Mouse coords
    xMoved := xCurrent -40
    yMoved := yCurrent 

    ;Check if the future mouse postion will be
    ;below the top border of your bounding box, 
    ;aka still inside it, after it has moved.
    ;If so, proceed and move the mouse,
    ;otherwise do nothing.
    if (xMoved > 1740) {
        MouseMove, xMoved, yMoved
    }
return  
}
d::
{
    ;Get current Mouse coords
    MouseGetPos, xCurrent ,yCurrent

    ;Calculate future Mouse coords
    xMoved := xCurrent +40
    yMoved := yCurrent 

    ;Check if the future mouse postion will be
    ;below the top border of your bounding box, 
    ;aka still inside it, after it has moved.
    ;If so, proceed and move the mouse,
    ;otherwise do nothing.
    if (xMoved < 1917) {
        MouseMove, xMoved, yMoved
    }
return  
}

По сути, вы управляете мышью с помощью WASD, и в ней есть и другие функциональные возможности, но я хочу сделать так, чтобы вам приходилось удерживать клавишу, чтобы двигаться. Спасибо!

1 ответ1

0

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

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

Вставляйте этот код в начале каждого определения горячей клавиши, и вам потребуется удерживать эту горячую клавишу в течение определенного периода времени, прежде чем она активируется, в противном случае нажатие клавиши будет отправляться регулярно. Вам также нужно будет добавить $ перед определением горячей клавиши, чтобы оператор Send не повторно запускал определение горячей клавиши дважды в строке и вызывал немедленное выполнение (так как эта функция-прекурсор отправит тот же ключ, что и горячая клавиша, если пользователь просто кратко нажимает клавишу и не удерживает ее).

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

$a::
{
    ; make these global or static as desired so they don't have to be reassigned for each function call
    holdDelay:=300          ; time to wait before activation (or conversely, must release before this time to send a keystroke)
    repeatDelay:=700        ; max time to detect a repeat event--must be bigger than holdDelay or won't work

    ; if we just triggered this key last time and it's been less than the repeat delay,
    ; bypass the hold-down check and skip directly to desired function for moving the mouse
    If Not ((A_ThisHotkey=A_PriorHotkey) && (A_TimeSincePriorHotkey<repeatDelay)) {

        trimmedHotkey:=Trim(A_ThisHotkey, "$")  ; get rid of preceding $ so we can detect and send just the keystroke

        startTick:=A_TickCount                              ; init timer
        While GetKeyState(trimmedHotkey, "P")               ; Loop while key is pressed down, otherwise exit    
        && !(heldDown:=(A_TickCount-startTick)>holdDelay)   ; check for helddown/timeout (user held the key down)
            Sleep 10                                        ; wait a few ms...

        If !heldDown {                  ; if user didn't hold the key down, send it back as a keystroke

            SendInput % trimmedHotkey
            Return 
        }

    }

    ; Rest of the code goes here

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .