# 重映射游戏杆为键盘或鼠标

## 目录

- 重要事项
- 让游戏杆按钮发送键击或者鼠标点击
- 让游戏杆轴向(Joystick Axis)或者视点帽(POV Hat)发送键击或者鼠标点击
- 备注

## 重要事项

- 虽然可以把游戏杆按钮或轴向重映射为按键或者鼠标按钮，但是不能把它映射为另一个游戏杆按钮或轴向。只能用游戏杆模拟器例如 PPJoy 来实现。
- AutoHotkey 用 1 至 32 之间一个唯一的数字来定义游戏杆上的每个按钮。要确定这些数字，请用游戏杆测试脚本。

## 让游戏杆按钮发送键击或者鼠标点击

以下是三种由易到难的方式。最复杂的方法适用于更广泛的情况（例如需要将按键或者鼠标按钮按住不放的游戏）。

方法 #1: 此方法发送简单的键击和鼠标点击。例如:

    Joy1::Send {Left} ;让按钮 #1 发送一个左箭头键击。
    Joy2::Click ;让按钮 #2 发送一个鼠标左键点击。
    Joy3::Send a{Esc}{Space}{Enter} ;让按钮 #3 发送字母"a"后紧跟 Escape, Space 和 Enter。
    Joy4::Send Sincerely,{Enter}John Smith ;让按钮 #4 发送一个两行的签名。

要让一个按钮执行多个命令，只要将第一个命令放在按钮名称之下并且使最后一个命令为 return。例如:

    Joy5::
    Run Notepad
    WinWait 无标题 - 记事本
    WinActivate
    Send This is the text that will appear in Notepad.{Enter}
    return

请看按键列表以获得完整的按键和鼠标/游戏杆按钮列表。

方法 #2: 此方法是在你按住一个游戏杆按钮的全程，键盘按键或者鼠标按钮也必须一直按住的情况下才使用的。下面的例子使游戏杆的第二个按钮成为左箭头按键：

    Joy2::
    Send {Left down} ;按住左箭头按键。
    KeyWait Joy2 ;等待用户松开游戏杆按钮。
    Send {Left up} ;释放左箭头按键。
    return

方法 #3: 此方法是你有多个在方法 #2 中所描述的游戏杆热键，并且有时会同时按下或释放这些热键的情况下才使用。下面的例子使游戏杆的第三个按钮成为鼠标左键：

    Joy3::
    Send {LButton down} ;按住鼠标左键。
    SetTimer, WaitForButtonUp3, 10
    return

    WaitForButtonUp3:
    if GetKeyState("Joy3") ;按钮仍处于按下状态的话就继续等待。
    return
    ;否则，按键已松开。
    Send {LButton up} ;松开鼠标左键。
    SetTimer, WaitForButtonUp3, off
    return

自动重复某个键击：有些程序或者游戏可能需要你重复地发送某个按键（就像你在键盘上按着它不放）。下面的例子在你按住游戏杆的第二个按钮时通过重复地发送空格键键击来达到此目的。

    Joy2::
    Send {Space down} ;按下空格键。
    SetTimer, WaitForJoy2, 30 ;将数字 30 减为 20 或 10 可以更快地发送按键。增加它会发送地更慢。
    return

    WaitForJoy2:
    if not GetKeyState("Joy2") ;按钮已经释放。
    {
    Send {Space up} ;释放空格键。
    SetTimer, WaitForJoy2, off ;停止监视按钮。
    return
    }
    ;因为上面没有“return”，所以按钮依然处于按住状态。
    Send {Space down} ;发送另一个空格键键击。
    return

环境敏感的游戏杆按钮：#IfWinActive/Exist 指令使选择的游戏杆按钮根据激活或存在的窗口类型而执行不同的动作(或者根本不执行)。

把游戏杆当鼠标来用：Joystick-To-Mouse 脚本通过重映射游戏杆的按钮和控制轴向把它变成鼠标。

## 让游戏杆轴向或视点帽发送键击或者鼠标点击

要让脚本对游戏杆轴向或者视点帽的移动做出响应，请用 SetTimer 和 GetKeyState。下面的例子将使游戏杆的 X 和 Y 轴表现得和键盘上的箭头按键群（左、右、上、下）一样。

    #Persistent ;保持脚本运行，直到用户明确地退出。
    SetTimer, WatchAxis, 5
    return

    WatchAxis:
    GetKeyState, JoyX, JoyX ;得到 x 轴的坐标。
    GetKeyState, JoyY, JoyY ;得到 y 轴的坐标。
    KeyToHoldDownPrev = %KeyToHoldDown% ; Prev 现在保存了先前按下的按键（如果有的话）。

    if JoyX > 70
      KeyToHoldDown = Right
    else if JoyX < 30
      KeyToHoldDown = Left
    else if JoyY > 70
      KeyToHoldDown = Down
    else if JoyY < 30
      KeyToHoldDown = Up
    else
      KeyToHoldDown =

    if KeyToHoldDown = %KeyToHoldDownPrev% ;已经按下了正确的按键（或不需要按键）。
      return ;什么也不做。

    ;否则，松开先前的按键并按下一个新键：
    SetKeyDelay -1 ;避免击键之间的延时。
    if KeyToHoldDownPrev ;先前的按键需要松开。
      Send, {%KeyToHoldDownPrev% up} ;松开它。
    if KeyToHoldDown ;要按下一个键。
      Send, {%KeyToHoldDown% down} ;按下它。
    return

下面的例子将让游戏杆的视点帽起到和键盘上的箭头按键群一样的作用；就是说，视点帽将发送方向键击（左、右、上、下）：

    #Persistent ;保持脚本运行，直到用户明确地退出。
    SetTimer, WatchPOV, 5
    return

    WatchPOV:
    GetKeyState, POV, JoyPOV ;获得视点控制的坐标。
    KeyToHoldDownPrev = %KeyToHoldDown% ; Prev 现在存储了先前按下的键（如果有的话）。

    ;有一些游戏杆会有平滑/连续的视角切换而不是固定的增幅。
    ;要全部支持它们，可用一个值域：
    if POV < 0 ;没有角度
      KeyToHoldDown =
    else if POV > 31500 ; 315 至 360 度：向上
      KeyToHoldDown = Up
    else if POV between 0 and 4500 ; 0 至 45 度：向上
      KeyToHoldDown = Up
    else if POV between 4501 and 13500 ; 45 至 135 度：向右
      KeyToHoldDown = Right
    else if POV between 13501 and 22500 ; 135 至 225 度：向下
      KeyToHoldDown = Down
    else ; 225 至 315 度：向左
      KeyToHoldDown = Left

    if KeyToHoldDown = %KeyToHoldDownPrev% ;已经按下了正确的键（或者不需要任何键）。
      return ;什么也不做。

    ;否则，释放先前的键并且按下一个新键:
    SetKeyDelay -1 ;避免击键之间的延时。
    if KeyToHoldDownPrev ;先前的按键需要释放。
      Send, {%KeyToHoldDownPrev% up} ;释放它。
    if KeyToHoldDown ;需要按下一个键。
      Send, {%KeyToHoldDown% down} ;按下它。
    return

自动重复某个键击：以上两个例子都可以修改为重复地发送按键，而不仅仅是按住它（也就是说，它们可以模拟按住了键盘上的某键）。要做到这一点，只需将下面这行：

    return ;什么也不做。

替换为：

    {
     if KeyToHoldDown
       Send, {%KeyToHoldDown% down} ;自动地重复键击。
     return
    }

## 备注

也可以使用除了第一个之外的游戏杆，只要通过在按钮或者轴名之前加上游戏杆编号。例如，2joy1 就是指二号杆的第一个按钮。

要获得更多有用的游戏杆脚本，请访问 AutoHotkey 论坛。搜索关键词例如 Joystick 和 GetKeyState 和 Send 有可能找到你想要的主题。

## 相关主题

Joystick-To-Mouse 脚本（将游戏杆当鼠标用）
游戏杆按钮、轴向以及控制器的列表
GetKeyState
重映射键盘和鼠标

翻译：handt 修正：天堂之门 menk33@163.com 2008年10月20日