旨在根据CapsLock状态进行切换的AHK脚本始终打开'off',我无法将其更改为'on'



(注意:脚本编写非常新手,从我在线的其他脚本中借用了一些短语。 我有腕管并玩一个没有任何未设置为 F1-F0 键的键绑定选项的视频游戏,所以我想将 F1-F4 键重新绑定到 Z-V,但仅在启用 capslock 时,以防止无法在不关闭脚本的情况下在聊天窗口和其他程序中键入。 但是,该脚本仅在 capslock 关闭时将基本键重新绑定到 f 键,而不是允许我将其更改为 ON。 不知道为什么。

我尝试通过将其重新绑定到 Numlock 来"修复"它,但是当我移动到 CapsLock 时,将"OFF"更改为"ON"并没有阻止脚本仅在 CapsLock 关闭时重新绑定键。 不知道为什么。

$Z::
GetKeyState, state, NumLock, T
if state = D ; NumLock is toggled ON
send, {z}
else
send, {F1}
Return 

$X::
GetKeyState, state, NumLock, T
if state = D ; NumLock is toggled ON
send, {x}
else
send, {F2}
Return 
etc...
etc...

我预计将值"OFF"更改为"ON"将导致密钥重新绑定仅在 CapsLock 状态被打开期间发生。

您是否检查过更改后是否重新启动了脚本?这是一个非常常见的错误,不仅在初学者中。根据您的示例,您的密钥Z..V应该表现得像F1..仅当NumLock关闭时F4

鉴于脚本的性质,您可以考虑添加指令#SingleInstance Force每次再次运行脚本时,该指令都会自动将脚本的任何旧实例替换为新实例,从而使测试更容易。


您可以使用#if指令轻松执行条件绑定,这使得后续热键和热字符串仅在满足条件时才有效。

要检查 CapsLock 或 NumLock 键的状态,您还可以使用内置函数GetKeyState,对于切换键,例如CapsLockNumLock,具有"T"模式根据键的切换状态返回 True 或 False。

此外,如果要重新映射密钥,只需在热键的右侧写入目标键的名称,这将在 Down 和 Up 事件上完全绑定密钥。但是,要使其正常工作,您必须将触发键指定为小写,因为指定大写只会在使用 Shift 键按下键时触发重新映射(CapsLock 不起作用),这不是您想要的行为。[有关重新映射键的更多信息]

下面是您可以执行的操作的示例:

#If GetKeyState("CapsLock", "T")
z::F1
x::F2
c::F3
v::F4

请注意,由于键重新映射始终使用键盘挂钩(因为它也需要注册 Up 事件),因此根本不需要在热键中使用$前缀。


尽管如此,如果您将当前活动窗口用作热键的条件并使用#IfWinActive指令将它们绑定到您的游戏,则可以进一步自动化脚本。

但是,如果游戏中也有聊天,您可能希望将这两个条件组合在一个#If中,使用内置函数WinActive如下所示:

#If GetKeyState("CapsLock", "T") and WinActive("My Game Title")
z::F1
; ...

您可以在 WinTitle 参数的文档上查看如何按标题缩小窗口搜索范围。


如果你想进一步改进你的脚本,你可以探索当聊天处于活动状态时,游戏窗口上是否有任何可检测到的变化,例如是否存在某个控件(你可以使用WinExist函数检查它就像是另一个窗口一样检查某个 Window 类。

要查找此类更改,您可以使用如下脚本(来自 MouseGetPos 文档):

#Persistent
SetTimer, WatchCursor, 100
return
WatchCursor:
MouseGetPos, , , id, control
WinGetTitle, title, ahk_id %id%
WinGetClass, class, ahk_id %id%
ToolTip, ahk_id %id%`nahk_class %class%`n%title%`nControl: %control%
return

这将允许您查看鼠标下方窗口的窗口信息。您可以使用它通过将鼠标放在聊天控件上来检查聊天控件的名称或类。

但是,请记住,许多游戏在其界面中根本不使用 Windows 控件,而只是自己在屏幕上绘制它们,因此,如果您正在尝试此操作并且在一段时间后无法取得太大进展,则不应浪费太多时间,而是喜欢玩CapsLock切换绑定。


检查聊天是否处于活动状态的另一种棘手方法是使用ImageSearch或更简单的PixelGetColor在屏幕上搜索图像或像素颜色,但只有在游戏界面不是很复杂/动画的情况下才能这样做。

最新更新