autohotkey2.0 盲从模式

官网对盲从模式的说明,太晦涩难解,因为好多话没有说透。

官网说明

盲从模式

可以使用 {Blind} 启用盲从模式, 该模式通过禁用通常自动执行的许多操作来使脚本按预期运行, 从而赋予脚本更多控制权. 要启用盲从模式, {Blind} 必须是字符串中的第一个项目. 它具有以下效果:

•如果在发送开始时为按下的状态, 则盲从模式避免释放这些修饰符键(Alt, Ctrl, Shift 和 Win), 除非该修饰键被排除了. 例如, 热键 +s::Send "{Blind}abc" 将发送 ABC 而不是 abc, 因为用户按住了 Shift.

•修饰键有不同的恢复方式, 以允许 Send 能关闭热键的修饰键, 即使用户在物理上仍然是按下的. 例如, 如果用户仍然物理按住 Ctrl, 则 ^space::Send "{Ctrl up}" 自动推送 Ctrl 按下, 而 ^space::Send "{Blind}{Ctrl up}" 允许 Ctrl 逻辑松开, 即使它物理上是按下的.

•SetStoreCapsLockMode 会被忽略; 也就是说, 不会改变 CapsLock 的状态.

•菜单掩饰是禁用的. 也就是说, Send 忽略额外的击键, 这些键原本会被发送, 以防止: 1) 在按下 Win(LWin/RWin) 键时, 出现开始菜单; 2) 在按下 Alt 键时, 菜单栏的激活. 然而, 盲从模式不会阻止在钩子热键激活后由键盘钩子进行的掩饰.

•即使文本包含一个 L, Send 也不会等待 Win 被释放. 一般情况下会等待, 以防止 Send 触发系统 "锁定工作站" 的热键(Win+L). 有关详情, 请参阅热键.

单词 "Blind" 后面可以用一个或多个修饰符号(!#^+) 以便在需要时自动释放这些修饰符. 例如, *^a::Send "{Blind^}b" 在按下 Ctrl+Shift+A 时, 将发送 Shift+B 而不是 Ctrl+Shift+B. {Blind!#^+} 可以在需要的时候释放所有的修饰符, 但是会启用盲从模式的其他效果.

在重映射按键时, 盲从模式可以在其内部使用. 例如, 重映射 a::b 会发生这样的情况: 1) 输入 "a" 时会映射为 "b"; 2) 输入大写字母 "A" 时映射为大写字母 "B"; 并且 3) 按下 Ctrl+A 时映射为按下 Ctrl+B. 如果任何修饰符指定为源按键(包括 Shift 如果源按键是大写字母), 则如上所述, 这些修饰符被排除在外. 例如 ^a::b 产生的是正常的 B, 而不是 Ctrl+B.

SendText 或 ControlSendText 不支持 {Blind}; 请使用 {Blind}{Text} 代替.

SendPlay 不完全支持盲从模式, 尤其是在处理修饰键时(Ctrl, Alt, Shift 和 Win).

交代清楚前因后果就容易理解

官方文档的表述确实比较偏技术和底层。要理解 {Blind}(盲从模式),我们可以用一个简单的比喻来解释:

默认情况下,AutoHotkey(AHK)是一个“过度热心且自作聪明”的管家。当你让它发送一段按键时,它会为了保证结果“绝对正确”,而在后台偷偷帮你松开或按下很多键。

而加上 {Blind} 之后,AHK 就变成了“闭上眼睛”的盲人(或者说是一个绝对服从的笨蛋)。它不再管你当前手里按着什么键,也不再做任何多余的保护动作,你代码里写什么,它就硬生生地叠加发送什么。

我们把文档里那些难懂的条目,翻译成大白话:

1. 它不再偷偷松开你的修饰键(最常用的功能)

  • 默认情况(自作聪明): 假设你写了热键 +s::Send "abc"(按 Shift + s 发送 abc)。当你按下 Shift 和 s 时,AHK 为了确保发出的是小写的 abc,会在零点几秒内强行在系统里帮你“松开” Shift,发送 abc,然后再把你物理按着的 Shift “按”回去
  • 加了 {Blind} 后: 你写了 +s::Send "{Blind}abc"。AHK 闭上了眼睛,不管你现在按着什么。因为你手里实际上正按着 Shift,所以发出来的 abc 就会变成大写的 ABC
  • 总结: {Blind} 让你物理按下的 Ctrl、Shift、Alt、Win 键,能直接作用于 Send 发送的字符上。

2. 它允许代码“打败”你的物理手指

  • 默认情况: 假设你一直用手指死死按着 Ctrl 键,但你的代码里写了 Send "{Ctrl up}" 想让 Ctrl 松开。AHK 侦测到你的手指还在按着,就会自作主张地说:“主人还没松手呢,我不松!”导致代码失效。
  • 加了 {Blind} 后: AHK 变成了盲人,它看不到你的手指,只听代码的。代码让它松开 Ctrl,它就在系统里把 Ctrl 松开了,哪怕你的手指依然死死按在键盘上

3. 不管你的大小写锁定灯(CapsLock)

  • 默认情况: AHK 发送字母时,为了保证大小写准确,有时会偷偷改变你 CapsLock 的状态。
  • 加了 {Blind} 后: 它完全不碰你的 CapsLock,灯亮着就是亮着,灭着就是灭着。

4. 不再帮你屏蔽“烦人的菜单”

  • 默认情况: 你知道单独按 Win 键会弹出开始菜单,单独按 Alt 键会激活窗口顶部的菜单栏。AHK 在发送包含这两个键的组合时,为了防止把这些菜单呼出来打断你的工作,会偷偷发送一些“掩护按键”(比如偷偷按一下 Ctrl)来抵消菜单。
  • 加了 {Blind} 后: AHK 撤销了这种保护。所以使用 {Blind} 时,可能会不小心呼出开始菜单或激活菜单栏。

5. 不怕把电脑锁死(Win + L)

  • 默认情况: Windows 系统里 Win + L 是直接锁屏的。如果你按着 Win 键,而 AHK 正好要发送字母 L,AHK 吓坏了,它会暂停脚本,死死等待你把 Win 键松开,才敢把 L 发出去,以免你不小心把电脑锁了。
  • 加了 {Blind} 后: AHK 闭着眼睛不管死活,直接发送 L。如果你正好按着 Win,恭喜你,电脑直接锁屏。

其他进阶用法的“大白话”解释:

1. 半盲模式:{Blind^}
有时候你只想让它在某个特定按键上“睁开眼睛”。比如 {Blind^} 意思是:“除了 Ctrl(^)你帮我看着点(该松开就松开),其他的 Shift、Alt、Win 全都给我闭上眼睛不管。”

2. 为什么说简单的重映射(比如 a::b)自带 {Blind}
当你用 AHK 把 a 改成 b 时,你肯定希望:按下 Shift + a 出来的是大写 B,按下 Ctrl + a 执行的是 Ctrl + B
这就是因为 AHK 在处理 a::b 这种最简单的单键替换时,**底层默认使用了 {Blind}**。它保留了你手里按着的那些修饰键,原汁原味地传递给了替换后的键。

一句话总结:
当你发现你的 AHK 脚本发送的按键“不听话”,或者因为你同时按着 Shift、Ctrl 导致发送的字符变了样,又或者你故意想要把你按住的 Ctrl/Shift 叠加给脚本发送的字母时,在 Send 的最开头加上 {Blind} 就能解决问题!

posted @ 2026-08-25 13:06  立体风  阅读(12)  评论(0)    收藏  举报