【问题标题】:How do I set up a keypress triggered by my mouse's position?如何设置由鼠标位置触发的按键?
【发布时间】:2020-05-11 16:16:21
【问题描述】:

我一直在玩一个只使用 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?

标签: autohotkey


【解决方案1】:

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

#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

【讨论】:

  • 所以我运行了这段代码,并打开了一个文本文档,但没有发送 a/+a 或 d/+d。 if 语句中工具提示后的分号是否必须去掉?
  • ToolTip 仅用于演示目的。将其替换为适当的发送命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多