具有Click / MoveMouse

时间:2016-03-23 19:45:29

标签: autohotkey

我做了一个快速的ahk脚本,移动了鼠标,发现鼠标没有移动到所需的位置。我设置了一个循环,每隔几秒就会不断地将光标移动到相同的位置,而鼠标将被移动到不同的,看似随机的位置。我发现这只是特定程序窗口聚焦的情况,如果我有任何其他程序聚焦鼠标按预期移动。我尝试使用Click / MouseMove,他们都表现出这种行为。我也尝试过DllCall(“SetCursorPosition”),但这甚至都不会移动鼠标。为了进一步澄清,当问题计划没有集中时,所有这三个工作都很好 - 我只是在问题计划集中时遇到了问题。

经过进一步检查,这似乎是由于该程序的自定义鼠标灵敏度实现。如果我使用MouseMove将光标相对于当前位置向下移动1个像素,它将向下移动~50。如果我增加了程序的鼠标灵敏度,它会进一步向下移动。我认为这也是我使用Click获得看似随机的鼠标位置的原因。

现在我已经实现了一个自定义点击功能,它可以取消程序,移动鼠标,重新聚焦程序,然后点击,但程序不喜欢这样。有时它可以工作,但有时程序会忽略鼠标点击窗口聚焦时鼠标的位置,导致脚本无法完成我希望它能够做的事情。

使用Click x,y / MouseMove时,有没有办法让我考虑这个程序的鼠标灵敏度?或者可能是移动鼠标的另一种方法,该方法不受程序鼠标灵敏度的影响。我尝试过使用所有类型的CoordMode,但它们都有同样的问题。

编辑:我正在使用的剧本

CoordMode, Mouse,Screen ; I've tried every CoordMode but none solve the problem

AppsKey::
    while true {
        Click 500,500,0
        sleep,2000
    }
Return

2 个答案:

答案 0 :(得分:0)

或者,可能是您没有使用CoordMode,默认情况下,当您没有指定时,不幸的是鼠标位置依赖于活动窗口,这可能会导致不可预测的结果你发现了为了提高可靠性,我喜欢在鼠标移动命令之前使用此命令将鼠标的坐标系设置为引用屏幕:

CoordMode, Mouse

说明

有关CoordMode的文档:

  

如果未使用此命令,除了其他文档之外的所有命令(例如WinMove和InputBox)都使用相对于活动窗口的坐标。

完整命令是

CoordMode, Mouse, Screen

但文档说我们可以省略第二个参数,它默认为Screen:

  

如果省略Param2,则默认为Screen。

因此,为了获得更一致的结果,请使用CoordMode命令。

答案 1 :(得分:0)

尝试使用SendPlay(但如果您使用UAC,请参阅下文):

AppsKey::
    while true {
        SetMouseDelay, 20, Play  ;  or play around with the delay amt
        sleep, 50  ;  or play around with the sleep amt
        SendPlay {Click 500,500,0}
        sleep, 50  ;  or play around with the sleep amt
        SetMouseDelay, 0
        sleep,2000
    }
Return

SendPlay [v1.0.43 +]

SendPlay的最大优势是能够在比其他模式更广泛的游戏中“回放”击键和鼠标点击。例如,特定游戏只有在拥有SendPlay选项时才可以接受热字符串。但是,如果启用了“用户帐户控制”,即使脚本以管理员身份运行,SendPlay也可能在Windows Vista或更高版本上完全没有任何效果。以下脚本提供了此问题的解决方法:http://www.autohotkey.com/forum/topic75595.html

在三种发送模式中,SendPlay是最不寻常的,因为它本身不能模拟击键和鼠标点击。相反,它会创建一系列直接流向活动窗口的事件(消息)(类似于ControlSend,但位于较低级别)。因此,SendPlay不会触发热键或热字串。