如何设置由鼠标位置触发的按键?

How do I set up a keypress triggered by my mouse's position?

我一直在玩一个只使用 LeftArrow/A(向左走)、RightArrow/D(向右走)和 shift(冲刺)的游戏。我正在努力制作一个宏,它会根据我鼠标的 x 坐标向左或向右按​​,并在我的鼠标更靠近屏幕边缘时冲刺。为了说明这一点,将以下变量(括号内)视为屏幕上的不同点,“|”作为边缘:

|---冲刺区---(A)---步行区---(B)不动(C)---步行区---(D)---冲刺区- --|

如果我的x坐标小于A或大于D,我想发送SHIFT+A或SHIFT+D(分别) 如果我的 x 坐标在 A 和 B 之间或 C 和 D 之间,我想发送 A 或 D(分别) 我的死区会在B和C之间。

这是我的 .ahk 文件的代码:

CoordMode, Mouse, Screen
SetTimer, Check, 20
return

Check:
;The following variables are the x-coordinates of my screen, which has a res of 3840x2160
a := 965
b := 1700
c := 2160
d := 2895
MouseGetPos, x, y
return
MouseLoop:
while (x < b || x > c) {
    MouseGetPos, x, y
    if (x > c) {
        if (x > d) {
            Send +d
            MouseGetPos, x, y
            goto, MouseLoop
        }
        else if (x <= d) {
            Send d
            MouseGetPos, x, y
            goto, MouseLoop
        }
        MouseGetPos, x, y
    }

    if (x < b) {
        if (x < a) {
            Send +a
            MouseGetPos, x, y
            goto, MouseLoop
        }
        else if (x >= a){
            Send a
            MouseGetPos, x, y
            goto, MouseLoop
        }
        MouseGetPos, x, y
    }
    if GetKeyState("Esc") {
        goto, Finished
    }
}
return
goto, MouseLoop

Finished:
Exit

使用函数,您总能获得更好的概览、控制和性能:

#Persistent
SetTimer, Check, 20
return

Check:
If Zone("Sprint_Zone_1")
    ToolTip, "Sprint_Zone_1" ; send +a
else
If Zone("Walk_Zone_1")
    ToolTip, "Walk_Zone_1" ; send a
else
If Zone("Dead_Zone")
    ToolTip
else
If Zone("Walk_Zone_2")
    ToolTip, "Walk_Zone_2" ; send d
else
If Zone("Sprint_Zone_2")
    ToolTip, "Sprint_Zone_2" ; send +d
return

Zone(name){

    a := 965
    b := 1700
    c := 2160
    d := 2895

    CoordMode, Mouse, Screen
    MouseGetPos, mX

    Sprint_Zone_1 := (mX < a)
    Walk_Zone_1 := (mX > a && mX < b)
    Dead_Zone := (mX > b && mX < c)
    Walk_Zone_2 := (mX > c && mX < d)
    Sprint_Zone_2 := (mX > d)

    If (name = "Sprint_Zone_1")
        return Sprint_Zone_1
    else if (name = "Walk_Zone_1")
        return Walk_Zone_1
    else if (name = "Dead_Zone")
        return Dead_Zone
    else if (name = "Walk_Zone_2")
        return Walk_Zone_2
    else if (name = "Sprint_Zone_2")
        return Sprint_Zone_2
}

Esc:: 
    SetTimer, Check, off
    ToolTip
return