【问题标题】:AutoHotKey macro - difficulty with window focusAutoHotKey 宏 - 窗口焦点困难
【发布时间】:2012-12-30 06:27:27
【问题描述】:

上一个问题: 我正在玩一个基本上是 Hangman 的在线 Flash 游戏。输入字母的唯一方法是在游戏中的屏幕键盘上单击它们。 我想编写某种宏,将键盘按下与鼠标位置映射,这样我就可以在键盘上键入字母并让鼠标点击相应的屏幕键盘字母。 我在戴尔笔记本电脑上运行 Windows 7。有没有办法做到这一点?有什么程序可以帮助解决这个问题吗?如果有帮助,我有一些 Java 编程经验。

更新:我正在使用 AutoHotKey 编写宏。 这是我所拥有的:

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
LAlt & a::
IfWinExist Bearville - Mozilla Firefox
{
    WinActivate
}
DllCall("mouse_event", "UInt", 0x01, "UInt", 460, "UInt", 560) ; move 
DllCall("mouse_event", "UInt", 0x02) ; left button down
DllCall("mouse_event", "UInt", 0x04) ; left button up
sleep 250
DllCall("mouse_event", "UInt", 0x01, "UInt", -460, "UInt", -560) ; move 
return
LAlt & b::
IfWinExist Bearville - Mozilla Firefox
{
    WinActivate
}
DllCall("mouse_event", "UInt", 0x01, "UInt", 500, "UInt", 560) ; move 
DllCall("mouse_event", "UInt", 0x02) ; left button down
DllCall("mouse_event", "UInt", 0x04) ; left button up
sleep 250
DllCall("mouse_event", "UInt", 0x01, "UInt", -500, "UInt", -560) ; move 
return

等等。如果窗口未激活,请激活它。将指针从左上角移动到屏幕上的字母位置,鼠标左键上下,等待250毫秒(因为没有延迟导致点击不注册),然后将指针移回起始位置. 这适用于一个字母,但如果我随后尝试输入另一个字母,则只要按下左 alt 键,窗口就会失去焦点。完成输入热键会使窗口激活,但指针似乎没有移动或单击,并且窗口再次失去焦点。我该如何解决?

【问题讨论】:

    标签: macros autohotkey


    【解决方案1】:

    如果虚拟键盘有固定位置,可以用这个...

    a::MouseClick, left, 150,150
    b::MouseClick, left, 250,250
    

    只需使用 autoHotKey Window Spy 即可找到准确的鼠标坐标。虽然你需要这样做 26 次,但它很简单直接,不会导致任何注意力不集中的问题。

    【讨论】:

    • 哦,顺便说一句。如果您只想让这些键在游戏过程中以这种方式运行,请使用#IfWinActive, appname(确保在顶部设置 SetTitleMatchMode, 2)
    • 键盘的位置确实取决于窗口大小和缩放以及滚动的距离,但无论如何我都必须与这些保持一致。我会试试你的方法——我在关注我在博客上看到的东西,因为我是 autohotkey 的菜鸟。
    • 或者,您可以添加一个“学习”部分,在开始游戏之前,您必须单击每个字母以告诉 autoHotKey 字母所在的位置。使脚本更长更复杂。
    • 它正在工作!非常感谢!我什至没有想过使用它的组合键(并且很难找到默认情况下不做其他事情的组合键)。由于我一次只会使用一段时间,所以我只是在不玩游戏的时候结束脚本。
    【解决方案2】:

    如果您出于某种原因使用 DllCalls 而不是发送,这可能不起作用,但我会为这种类型的应用程序编写一个热键,该热键启动一个循环,直到按下另一个热键,然后使用输入侦听任何键入的字符以单击。

    类似这样的:

    LAlt & a::
    IfWinExist Bearville - Mozilla Firefox
    {
        WinActivate
    }
    flag = 1
    while flag
    {
        Input, inval, B L1, {Space}
        IfInString, errorlevel, EndKey
        {
            flag = 0
        } else {
            x, y = locationForChar(inval)
            ;I'd reccomened a switch or if statement chain
            Send {Click %x%, %y%}
        }
    }
    

    这应该在按下“LAlt & a”热键后开始读取所有输入,并在按下空格键后终止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      相关资源
      最近更新 更多